在python中为大型文件创建校验和的最快方法
我需要通过网络传输大型文件,并需要每小时为它们创建校验和。所以生成校验和的速度对我来说至关重要 不知何故,我无法使zlib.crc32和zlib.adler32在Windows XP Pro 64位计算机上处理大于4GB的文件。我想我已经达到32位的限制了?使用hashlib.md5我可以得到一个结果,但问题是速度。为4.8GB文件生成md5大约需要5分钟。任务管理器显示流程仅使用一个核心 我的问题是:在python中为大型文件创建校验和的最快方法,python,multithreading,md5,crc32,hashlib,Python,Multithreading,Md5,Crc32,Hashlib,我需要通过网络传输大型文件,并需要每小时为它们创建校验和。所以生成校验和的速度对我来说至关重要 不知何故,我无法使zlib.crc32和zlib.adler32在Windows XP Pro 64位计算机上处理大于4GB的文件。我想我已经达到32位的限制了?使用hashlib.md5我可以得到一个结果,但问题是速度。为4.8GB文件生成md5大约需要5分钟。任务管理器显示流程仅使用一个核心 我的问题是: 有没有办法使crc在大文件上工作?我更喜欢使用crc而不是md5 如果没有,那么有没有办法加
PS:我正在研究类似的东西,比如“资产管理”系统,有点像svn,但资产由大型压缩图像文件组成。这些文件有微小的增量更改。散列/校验和用于检测更改和错误检测。您不可能使用多个核心来计算一个大文件的MD5散列,因为MD5的本质是:它期望消息被分块并按严格的顺序输入散列函数。然而,您可以使用一个线程将文件读入内部队列,然后在一个单独的线程中计算哈希值,以便。我不认为这会给您带来任何显著的性能提升
处理一个大文件需要如此长的时间这一事实可能是由于“无缓冲”读取。试着一次读取16 Kb,然后将内容分块输入哈希函数。md5本身不能并行运行。但是,您可以将文件分为多个部分(并行)进行md5,并获取散列列表的md5 然而,这假设散列不是IO限制的,我怀疑是这样的。正如安东·戈戈列夫(Anton Gogolev)所建议的那样——确保高效地读取文件(以2次幂的大数据块)。完成此操作后,请确保文件没有碎片 对于新项目,还应选择诸如sha256之类的散列,而不是md5
对于4Gb文件,zlib校验和是否比md5快得多?您尝试过该模块吗?这是一个算法选择问题,而不是库/语言选择问题 主要有两点考虑:
- 磁盘I/O对总体性能的影响有多大
- 错误检测功能的预期可靠性是什么
旁注:Alder32不限于低于特定阈值的消息大小。这可能只是ZlibAPI的一个限制。(顺便说一句,我找到的关于zlib.adler32的参考资料使用了缓冲区,而且……在我们的大量消息的上下文中,这种方法是要避免的,以流式流程为准:从文件中读取一点,计算,重复…)首先,任何CRC算法中都没有任何固有的东西可以阻止它们处理任意长度的数据(但是,特定的实现很可能会施加限制) 但是,在文件同步应用程序中,这可能无关紧要,因为当文件变大时,您可能不希望散列整个文件,而只希望将其分块。如果散列整个文件,并且两端的散列值不同,则必须复制整个文件。如果散列固定大小的块,则只需复制散列已更改的块。如果对文件的大部分更改都是本地化的(例如数据库),那么这可能需要更少的复制(并且更容易将每个块的计算分散到多个核心上) 至于散列算法本身,基本的折衷是速度与不冲突(两个不同的数据块产生相同的散列)。CRC-32速度很快,但只有2^32个唯一值,可能会出现冲突。MD5的速度要慢得多,但有2^128个唯一值,因此几乎永远不会看到碰撞(但理论上仍然可能)。较大的散列(SHA1、SHA256等)具有更多的唯一值,但速度较慢:我怀疑您是否需要它们:您担心意外冲突,而数字签名应用程序则担心故意(恶意)设计的冲突
听起来您正在尝试做一些与rsync实用程序非常相似的事情。你能用rsync吗?在XP中,你可能会遇到文件大小的限制。64位为您提供了更多的寻址空间(删除了每个应用程序2GB(或更多)的寻址空间),但可能对文件大小问题没有任何作用。有什么原因不能只使用rsync吗?您是否需要检查它们的完整性(使用适当的算法,这是实际问题)仅仅因为您需要