Оптимальный размер чтения файлового буфера? - PullRequest
19 голосов
/ 12 октября 2009

Я пишу приложение, которое должно читать довольно большие файлы. Я всегда задавался вопросом, каков оптимальный размер буфера чтения на современном компьютере с Windows XP. Я гуглил и нашел много примеров, в которых 1024 имели оптимальный размер.

Вот фрагмент того, что я имею в виду:

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

Мое приложение довольно простое, поэтому я не собираюсь писать код для тестирования, но хотел бы знать, какие размеры распространены?

Ответы [ 2 ]

9 голосов
/ 12 октября 2009

Размер буфера в 1 КБ кажется немного маленьким. Как правило, размер буфера «один размер подходит всем» отсутствует. Вам необходимо установить размер буфера, который соответствует поведению вашего алгоритма. Теперь, вообще-то, не очень хорошая идея иметь действительно огромный буфер, но иметь слишком маленький или не соответствующий тому, как вы обрабатываете каждый блок, тоже не так уж и хорошо.

Если вы просто читаете данные один кусок за другим целиком в память перед их обработкой, я бы использовал больший буфер. Я бы, вероятно, использовал 8 КБ или 16 КБ, но, вероятно, не больше.

С другой стороны, если вы обрабатываете данные в потоковом режиме, чтение блока, а затем обработка его перед чтением следующего, более полезные буферы меньшего размера. Еще лучше, если вы используете потоковую передачу данных со структурой, я бы изменил объем прочитанных данных, чтобы они точно соответствовали типу данных, которые вы читаете. Например, если вы читаете двоичные данные, которые содержат 4-символьный код, число с плавающей запятой и строку, я бы прочитал 4-символьный код в массив из 4 байтов, а также число с плавающей запятой. Я бы прочитал длину строки, а затем создал буфер для одновременного чтения всего фрагмента строковых данных.

Если вы выполняете потоковую обработку данных, я бы посмотрел на классы BinaryReader и BinaryWriter. Это позволяет очень легко работать с двоичными данными, не беспокоясь о самих данных. Это также позволяет вам отделить ваш буфер по размеру от фактических данных, с которыми вы работаете. Вы можете установить 16-килобайтный буфер в базовом потоке и легко читать отдельные значения данных с помощью BinaryReader.

3 голосов
/ 12 октября 2009

Зависит от того, где вы проводите грань между временем доступа и использованием памяти. Чем больше буфер, тем быстрее - но дороже с точки зрения памяти. чтение кратно размера кластера вашей файловой системы, вероятно, является наиболее эффективным, в системе Windows XP с NTFS 4K является размером кластера по умолчанию.

Вы можете увидеть эту ссылку Размер кластера по умолчанию для NTFS, FAT и exFAT

Bye.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...