1

已解决- 我结合使用手动管理(绕过垃圾收集器)和映射的 NSData 选项。事实证明,iStat 没有正确的内存数字,而 Instruments 表明了预期的行为。此外,CC_MD5() 和 CC_SHA1() 调用确实已经调用了 CC_MD5_Update() 和 CC_SHA1_Update(),因此它们也不会引起问题。

我目前正在开发一个需要使用 SHA-1 和 MD5 散列大量文件的 Cocoa 应用程序。我正在使用 CC_MD5 和 CC_SHA1 并将文件读入 NSData 对象。但是,即使没有引用 NSData 对象,这也会使用大量 RAM 并且由于某种原因像筛子一样泄漏内存……我怀疑这是垃圾收集器努力跟上的原因。

什么是最好的(如果可能的话也是最简单的,但我不反对做一些额外的工作来加快速度)在这样的大量文件上执行 MD5 和 SHA-1 哈希?

跟进

如下所述,映射的 NSData 可能会有所帮助,但我想我找到了另一种选择。它仍然需要一些工作,但似乎是一个更强大的解决方案。这个想法是使用 NSFileHandle 并读取“块” - 所以一次最多可能是 256MB。然后(例如对于 MD5)使用 CC_MD5() 后跟一系列 CC_MD5_Update() 来计算块中的散列。将其与手动内存管理相结合应该会有所帮助。

4

1 回答 1

3

你在使用内存映射文件吗?这样您就不必将整个文件读入内存,操作系统将负责缓存所需的内容:

[NSData dataWithContentsOfFile:@"filename.dat" 
                       options:NSDataReadingMappedIfSafe 
                         error:&error];

(也可以使用 NSDataReadingMappedAlways 强制内存映射)

于 2011-10-06T09:46:59.003 回答