Производительность при чтении файла построчно против чтения всего файла - PullRequest
7 голосов
/ 10 октября 2011

Есть ли заметная разница (теоретически) при чтении строки построчно по сравнению с чтением всего файла за один раз?

Чтение всего файла негативно влияет на объем используемой памятино работает ли он быстрее?

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

Я уже настроил prgm для чтения построчнои я хочу знать, стоит ли пытаться изменить его, чтобы прочитать весь файл (нелегко, учитывая мои настройки).

Спасибо,

Ответы [ 6 ]

2 голосов
/ 10 октября 2011

Чтение всего файла будет немного быстрее - но не намного!

Но будьте осторожны, чтение всего файла не масштабируется, поскольку вы ограничены доступной памятью в системе, как только размер файла превышаетРазмер оперативной памяти, доступной вашей программе, при которой начнется использование пространства подкачки, будет намного медленнее.Если размер файла превышает размер доступной виртуальной памяти, ваша программа завершится сбоем.

1 голос
/ 10 октября 2011

Как и другие, я считаю, что выполнение большего чтения в некоторых случаях улучшит производительность вашего приложения, но не ожидайте чудес, поскольку ввод / вывод уже буферизован на уровне ОС, поэтому вы выиграете только за счет сокращения накладных расходов слишком много вызовов для чтения. Чтение всего файла за один раз опасно, если вы не знаете максимально возможный размер ваших входных файлов. Наиболее разумным подходом является чтение файла большими блоками.

Если вы хотите улучшить еще больше, вам следует рассмотреть возможность совмещения ввода-вывода с обработкой. Допустим, вы читаете входной файл блоками по 128 МБ. В вашем основном потоке вы читаете первый 128-мегабайтный блок и затем передаете его в рабочий поток для обработки. Пока рабочий поток начинает работать, основной поток читает второй 128-мегабайтный блок. С этого момента, пока рабочий поток обрабатывает блок N, основной поток читает блок N + 1 с диска.

0 голосов
/ 17 мая 2016

Я думаю, это будет зависеть от потребностей вашего приложения (как и большинство вещей, я знаю).Чтение файла размером 1 МБ в Node js в ~ 3-4 раза быстрее с помощью fs.readFile (), чем при использовании читаемого потока или программы чтения строк, поскольку выполняется только чтение файла.Потоки могут предложить дополнительную производительность, если файл очень большой и вы обрабатываете ввод на лету.Это также может быть идеальным вариантом, если ваше приложение уже потребляет много памяти, поскольку процесс Node имеет ограничение в ~ 1,5 ГБ памяти на 64-битных системах.Обработка фрагментов по мере их поступления также может быть более производительной, если источник данных является медленным по сравнению с тем, насколько быстро процессор может его обрабатывать (архивы на жестком диске или на ленте, сетевые соединения, такие как TCP).Что касается чтения файла в память или потоковой передачи в память, я предполагаю, что издержки вызова функции при отправке событий данных и переключении на обратный вызов функции обработки замедляют процесс.

0 голосов
/ 10 октября 2011

Одним из факторов является то, сколько данных вы собираетесь читать и как долго изначально запускается программа, то есть, есть ли какое-то преимущество в работе над производительностью.

См. Цитаты из книги в этом ответе , чтобы получить хороший общий совет о том, как думать о производительности программного обеспечения.

(я знаю, что вы за ответ в теории , но этот аспект того, когда беспокоиться о производительности, также важен, когда у вас есть ограниченное количество времени.)

0 голосов
/ 10 октября 2011

Чтение всего файла в память, как правило, не очень хорошая идея, потому что файлы могут быть огромными и могут занимать много памяти, а в худшем случае нехватки памяти.Итак, чтобы сбалансировать производительность и использование памяти, вы считываете блок файла в буфер и анализируете буфер.Когда вы закончите обработку блока, читайте следующий блок до EOF.

Выбор правильного размера блока должен быть сделан на основе того, чего вы хотите достичь.

0 голосов
/ 10 октября 2011

Если честно, после того, как я некоторое время изучал эффективность, я пришел к выводу о вашем вопросе: это зависит от того, как часто этот файл будет читаться. Если вы прочитаете это один раз, то сделайте все это, потому что это просто освободит процесс для других задач. Опять же, еще одна вещь, которую нужно иметь в виду, будет ли файл редактироваться позже и потребовать обновления (как в случае чтения только обновленной части?), Если это так, вам может понадобиться установить маркер, чтобы определить, откуда читать (и затем снова как часто оно обновляется?). Но да, если это одноразовая работа, продолжайте читать ее целиком, если вам не требуется, чтобы токены создавались из определенных литералов в файле. надеюсь, это поможет.

...