已解决- 我结合使用手动管理(绕过垃圾收集器)和映射的 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() 来计算块中的散列。将其与手动内存管理相结合应该会有所帮助。