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

时间:2011-12-21 10:38:08

标签: c++ c visual-c++ sha1

我有一个新手问题,我从未读过大于4Mb的文件,其功能类似于fopen,ReadFile(WINAPI)。我的问题是什么是将400 MB的512位加载块大文件读入内存的最佳方法是什么?

由于

2 个答案:

答案 0 :(得分:1)

首先 - 在第一个例子 - 你可能不想读那么小 - 来自磁盘的几千字节更好。在你的情况下 - 一个简单的实现可以读取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

答案 1 :(得分:1)

如果您阅读大文件,通常需要关闭文件缓冲。因为如果不这样做,即使您只读取或写入一次并且不再使用它们,也会使用这些大文件填充系统的文件缓存。因此,更频繁访问的文件不再是缓存,系统在一段时间内会很慢。

文章File Buffering描述了如何在不缓冲的情况下访问文件。不幸的是,直接文件访问并不像在Windows中那样容易。

话虽如此,400 MByte通常不是问题。除非文件远大于1 GB,否则我不会使用直接文件访问。