已解决 - 我使用了手动管理(绕过垃圾收集器)和映射的NSData选项的组合。事实证明,iStat没有正确的记忆图,仪器表明了预期的行为。另外,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()来计算块中的散列。将其与手动内存管理相结合应该会有所帮助。
答案 0 :(得分:3)
您使用的是内存映射文件吗?这样你就不必将整个文件读入内存,操作系统将负责缓存所需的内容:
[NSData dataWithContentsOfFile:@"filename.dat"
options:NSDataReadingMappedIfSafe
error:&error];
(您也可以使用NSDataReadingMappedAlways强制内存映射)