Подтвердить что ты не робот

Оптимальный размер файла для чтения буфера?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Bye.