Рассчитать контрольную сумму sha-1 или CRC32 для больших файлов> 400 МБ - PullRequest
0 голосов
/ 21 декабря 2011

У меня вопрос новичка, я никогда не читал файлы размером более 4 Мб с такой функцией, как fopen, ReadFile (WINAPI). Мой вопрос: каков наилучший способ чтения большого файла, например, 400 МБ, загружать блоки 512 бит в память?

Спасибо

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

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

В статье Буферизация файлов описано, как получить доступ к файлам без буферизации. К сожалению, прямой доступ к файлам не так прост, как в Windows.

Сказав это, 400 МБ обычно не проблема. Я бы не использовал прямой доступ к файлам, если размер файлов не превышает 1 ГБ.

1 голос
/ 21 декабря 2011

Прежде всего - в первую очередь - вы можете не захотеть читать это маленькое число - лучше всего несколько килобайт, когда речь идет о диске.В вашем случае - простая реализация может прочитать 16 КБ - и затем циклически просмотреть эти 32 раза для ваших 512-байтовых операций.

На самом деле это не так важно, поскольку ОС умна и, как правило, будет вас угадывать -и все равно читать больше.Так что наивная реализация, где вы просто делаете

do 
{ 
  bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL); 
  do-something-with-nBytesRead; 
} while(!bResult &&  nBytesRead != 0); 
if (nBytesRead) error..; 

, - это нормально.

Если вы знаете, что у вас всегда будут такие (довольно большие) файлы, производительность важна иесть и другие способы использования этих файлов - затем рассмотрите «отображение памяти» файла - то есть откройте его таким образом, чтобы весь файл появился в виртуальной памяти.Посмотрите на http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx для этого.

...