2009-10-11 3 views
17

Я пишу приложение, которое должно читать довольно большие файлы. Я всегда задавался вопросом, каков оптимальный размер для буфера чтения на современном компьютере под управлением Windows XP. Я googled и нашел много примеров, которые имели 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); 
} 

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

+0

Может быть полезно: http://stackoverflow.com/questions/19558435/what-is-the-best-buffer-size-when-using-binaryreader-to-read-big-files-1gb/19837238? noredirect = 1 # 19837238 –

ответ

7

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

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

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

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

+0

Спасибо за предложение использовать BinaryReader. Использование BinaryReader помогает при чтении строк, так как мне не нужно писать код сантехники для записи длины. Я проведу 8K и 16K, чтобы узнать, улучшится ли производительность. Лично мне все равно, какой размер, но некоторые из сторон QA хотят видеть, можем ли мы улучшить производительность, используя оборудование и операционную систему лучше. –

+0

Вы можете попробовать более крупный буфер, если вы просто передаете большой объем данных в память. Пока вы держите размер буфера кратным размеру дискового кластера, вы должны быть оптимальными. Честно говоря, я думаю, что у меня все еще есть много моих давних 90-х и ранних 2000-х годов, которые все еще глубоко укоренились. Если системы, на которых запущена эта программа, являются современной и высокой производительностью, могут быть полезны буферы 32k, 64k и даже больше. Если вы сделаете слишком большой (скажем, 1 мб), вы можете увидеть уменьшающуюся отдачу, как и другие факторы (например, обкатка). Ключ соответствует чтению для поведения на низком уровне. – jrista

3

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

Вы можете увидеть эту ссылку Default cluster size for NTFS, FAT, and exFAT

Bye.

+0

Я попробую прочитать 8K и 16K, которые были предложены @jrista. Интересно, что в статье говорится, что в Windows используются кластеры 8k для разделов дисков из 16 TB. Я раньше не видел раздел. –

+1

Andrew, 8K и 16K являются мультиями 4K – RRUZ

+0

Старые жесткие диски читают и записывают целые 512-байтовые сектора за раз. Современные жесткие диски читают и пишут всего 4096-байтовых секторов за раз. Windows NTFS имеет (по умолчанию) размер кластера 4096 байт в момент времени. Используя трассировку событий для Windows, вы можете видеть, что Windows обычно использует фактический ввод/вывод жесткого диска для '16,384' байт, а также' 4096' байт (и в меньших размерах - 8192 и 49152 байт). В идеале держите кратное 4k, или 16384 байт. –