Читать весь файл в памяти VS читать в кусках - PullRequest
5 голосов
/ 06 мая 2011

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

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

Как я понимаю до сих пор:

Считать весь файл в памяти
Плюсы:
-Это быстро, потому что самая дорогостоящая операция - поиск, когда голова на месте, она может читать довольно быстро

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

Чтение файла кусками
плюсы:
-Просто (более интуитивно понятно) реализовать

while(numberOfBytes2Read > 0)
   read n bytes
   process read data

- он потребляет очень мало памяти

минусы:
-Это может занять гораздо больше времени, если диск должен снова искать файл и переместить головку в соответствующую позицию, что в среднем стоит около 12 мс.

Я знаю, что ответ зависит от размера файла (и аппаратного обеспечения). Я предполагаю, что лучше прочитать весь файл сразу, но для больших файлов это правда, каков максимальный рекомендуемый размер для чтения в памяти за один раз (в байтах или относительно аппаратного обеспечения - например,% от RAM)

Спасибо за ваши ответы и время.

Ответы [ 2 ]

7 голосов
/ 06 мая 2011

Рекомендуется читать файлы в буферах 4K или 8K .

Вы действительно никогда не должны читать файлы одновременно , если хотите записать их обратно в другой поток . Просто прочитайте в буфер и запишите его обратно. Особенно это касается веб-программирования.

Если вам нужно загрузить весь файл, так как вашей операции (обработка текста и т. Д.) Требуется все содержимое файла, буферизация не очень помогает, поэтому я считаю, что предпочтительнее для использования File.ReadAllText или File.ReadAllBytes.


Почему 4 КБ или 8 КБ?

Это ближе к основным буферам операционной системы Windows. Файлы в NTFS обычно хранятся в чанках 4 КБ или 8 КБ на диске, хотя вы можете выбрать чанки 32 КБ

1 голос
/ 06 мая 2011

Ваш кусок должен быть достаточно большим, 48 байтов, конечно, маленьким, 4K - разумно.

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