2009-10-11 38 views
17

Tôi đang viết một ứng dụng cần đọc các tệp khá lớn. Tôi đã luôn luôn tự hỏi kích thước tối ưu cho bộ đệm đọc trên máy tính Windows XP hiện đại là gì. Tôi googled và tìm thấy nhiều ví dụ mà có 1024 là kích thước tối ưu.Kích thước đọc tệp đệm tối ưu?

Dưới đây là một đoạn của những gì tôi có nghĩa là:

long pointer = 0; 
buffer = new byte[1024]; // What's a good size here ? 
while (pointer < input.Length) 
{ 
    pointer += input.Read(buffer, 0, buffer.Length); 
} 

Ứng dụng của tôi khá đơn giản, vì vậy tôi không muốn viết bất kỳ mã điểm chuẩn, nhưng muốn biết kích thước là phổ biến?

+0

Điều này có thể hữu ích: http://stackoverflow.com/questions/19558435/what-is-the-best-buffer-size-when-using-binaryreader-to-read-big-files-1gb/19837238? noredirect = 1 # 19837238 –

Trả lời

7

Kích thước bộ đệm 1k có vẻ hơi nhỏ. Nói chung, không có kích thước bộ đệm "một kích thước phù hợp với tất cả". Bạn cần đặt kích thước bộ đệm phù hợp với hành vi của thuật toán của bạn. Bây giờ, nói chung, nó không phải là một ý tưởng tốt để có một bộ đệm thực sự rất lớn, nhưng, có một mà là quá nhỏ hoặc không phù hợp với cách bạn xử lý từng đoạn không phải là tuyệt vời hoặc.

Nếu bạn chỉ đọc dữ liệu một đoạn sau khi hoàn toàn khác vào bộ nhớ trước khi xử lý, tôi sẽ sử dụng bộ đệm lớn hơn. Tôi có lẽ sẽ sử dụng 8k hoặc 16k, nhưng có lẽ không lớn hơn.

Mặt khác, nếu bạn đang xử lý dữ liệu theo kiểu truyền trực tuyến, hãy đọc một đoạn rồi xử lý dữ liệu trước khi đọc bộ đệm tiếp theo nhỏ hơn có thể hữu ích hơn. Thậm chí tốt hơn, nếu bạn đang truyền dữ liệu có cấu trúc, tôi sẽ thay đổi lượng dữ liệu được đọc để phù hợp cụ thể với loại dữ liệu bạn đang đọc. Ví dụ, nếu bạn đang đọc dữ liệu nhị phân có chứa mã gồm 4 ký tự, một phao và một chuỗi, tôi sẽ đọc mã 4 ký tự thành một mảng 4 byte, cũng như phao. Tôi sẽ đọc chiều dài của chuỗi, sau đó tạo một bộ đệm để đọc toàn bộ đoạn dữ liệu chuỗi cùng một lúc.

Nếu bạn đang thực hiện xử lý dữ liệu trực tuyến, tôi sẽ xem xét các lớp BinaryReader và BinaryWriter. Điều này cho phép bạn làm việc với dữ liệu nhị phân rất dễ dàng, mà không phải lo lắng nhiều về chính dữ liệu đó. Nó cũng cho phép bạn tách kích thước bộ đệm của bạn khỏi dữ liệu thực tế mà bạn đang làm việc. Bạn có thể đặt bộ đệm 16k trên luồng cơ bản và đọc dễ dàng các giá trị dữ liệu riêng lẻ với BinaryReader.

+0

Cảm ơn bạn đã đề xuất sử dụng BinaryReader. Sử dụng BinaryReader giúp khi đọc chuỗi vì tôi không cần viết mã ống nước để ghi độ dài. Tôi sẽ kiểm tra 8K và 16K lần đọc để xem hiệu suất có cải thiện hay không. Cá nhân, tôi không quan tâm kích thước là gì, nhưng một số các QA guys muốn xem nếu chúng ta có thể cải thiện hiệu suất bằng cách sử dụng phần cứng và hệ điều hành tốt hơn. –

+0

Bạn có thể thử một bộ đệm lớn hơn nếu bạn chỉ đơn giản là truyền một lượng lớn dữ liệu vào bộ nhớ. Miễn là bạn giữ kích thước bộ đệm là bội số của kích thước cụm đĩa, bạn nên tối ưu. Thành thật mà nói, tôi nghĩ rằng tôi vẫn còn có rất nhiều thực hành của những năm cuối thập niên 90 và đầu những năm 2000 vẫn ăn sâu. Nếu các hệ thống bạn đang chạy chương trình này là hiện đại và hiệu suất cao, bộ đệm 32k, 64k, thậm chí lớn hơn có thể hữu ích. Nếu bạn đi quá lớn (nói 1mb), bạn có thể thấy lợi nhuận giảm dần khi các yếu tố khác bắt đầu (tức là trao đổi xung đột). Khóa khớp với lần đọc đối với hành vi cấp thấp. – jrista

3

Phụ thuộc vào nơi bạn vẽ đường giữa thời gian truy cập và mức sử dụng bộ nhớ. Bộ đệm càng lớn, bộ nhớ càng nhanh - nhưng bộ nhớ càng đắt. đọc trong bội số kích thước cụm tệp Hệ thống tệp của bạn có lẽ là hiệu quả nhất, trong hệ thống Windows XP sử dụng NTFS, 4K là kích thước cụm mặc định.

Bạn có thể thấy liên kết này Default cluster size for NTFS, FAT, and exFAT

Tạm biệt.

+0

Tôi sẽ thử 8K và 16K lần đọc được đề xuất bởi @jrista. Điều thú vị là bài viết nói rằng các cửa sổ sử dụng các cụm 8k cho các phân vùng đĩa 16 TB. Tôi chưa từng thấy một phân vùng lớn trước đây. –

+1

Andrew, 8K và 16K là muliples của 4K – RRUZ

+0

Các ổ cứng cũ hơn đọc và viết toàn bộ các sector 512 byte tại một thời điểm. Ổ cứng hiện đại đọc và viết toàn bộ các sector 4096 byte tại một thời điểm. Windows NTFS có kích thước cụm (mặc định) là 4096 byte tại thời điểm đó. Sử dụng Event Tracing cho Windows, bạn có thể thấy rằng Windows thường sử dụng ổ cứng I/O cho '16,384' bytes, cùng với' 4.096' bytes (và đến mức độ thấp hơn là '8192' và' 49152' bytes). Lý tưởng nhất là giữ một bội số của 4k hoặc 16384 byte. –

Các vấn đề liên quan