我有一個新手問題,我從來沒有用fopen,ReadFile(WINAPI)等函數讀取大於4Mb的文件。我的問題是什麼是最好的方式來讀取一個大文件,如400Mb的512位加載塊到內存中?爲大文件計算sha-1或CRC32校驗和> 400mb
感謝
我有一個新手問題,我從來沒有用fopen,ReadFile(WINAPI)等函數讀取大於4Mb的文件。我的問題是什麼是最好的方式來讀取一個大文件,如400Mb的512位加載塊到內存中?爲大文件計算sha-1或CRC32校驗和> 400mb
感謝
首先 - 初審 - 你可能不想看小 - 一個幾千字節是更好的時候,從磁盤。在你的情況下 - 一個簡單的實現可以讀取16k - 然後遍歷這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。
如果您閱讀大文件,通常需要關閉文件緩衝。因爲如果你不這樣做,你可以用這些大文件填充系統的文件緩存,即使你只讀取或寫入一次而不再使用它們。因此,訪問頻率更高的文件不再緩存,系統在特定時間內速度會變慢。
文章File Buffering描述瞭如何在不緩衝的情況下訪問文件。不幸的是,直接文件訪問並不像在Windows中那樣容易。
話雖如此,400兆字節通常不是一個問題。除非文件大於1 GB,否則我不會使用直接文件訪問。