计算 400mb >大文件的 sha-1 或 CRC32 校验和



我有一个新手问题,我从来没有读过大于4Mb的文件,如fopen, ReadFile(WINAPI)。我的问题是什么是最好的方式来读取像400Mb的512位加载块到内存中的大文件?

谢谢

首先-在第一次实例中-您可能不希望读取那么小-从磁盘读取几个kBytes更好。在您的例子中,一个简单的实现可以读取16k,然后为512字节的操作循环32次。

在现实中,这不是那么重要-因为操作系统很聪明,通常会猜测你-无论如何,阅读更多。这是一个简单的实现,你只需输入

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中那么容易。

话虽如此,400mbyte通常不是问题。我不会使用直接文件访问,除非文件比1gbyte大得多。

最新更新