2011-10-06 50 views
1

已解决 - 我使用了手动管理(绕过垃圾回收器)和映射的NSData选项的组合。事实证明,iStat没有正确的内存数字,仪器显示了预期的行为。此外,CC_MD5()和CC_SHA1()调用确实已经调用了CC_MD5_Update()和CC_SHA1_Update(),所以它们也不会导致问题。MD5和SHA-1海量文件的散列

我目前正在研究需要使用SHA-1和MD5散列大量文件的Cocoa应用程序。我正在使用CC_MD5和CC_SHA1并将文件读入一个NSData对象。但是,由于某些原因,这会使用大量的RAM并泄漏内存,即使NSData对象没有被引用也是如此......我怀疑这是垃圾收集器难以跟上的。

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

后续

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

回答

3

你使用内存映射文件吗?这样,你不必将整个文件读入内存,操作系统将缓存需要什么护理:

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

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

+0

我没有尝试因为它似乎是一个很好的解决方案,但它仍然有一些令人讨厌的泄漏。我正在切换回手动管理(绕过垃圾收集器),所以我想看看这与明确的释放相结合是否有帮助。 –

+0

另请参阅以上有关以块读取文件的后续操作。我将尝试将其与手动内存管理结合起来,然后在其上尝试映射的NSData,以查看它在这些条件下是否有所不同。 –

+0

好的,我切换到手动,垃圾收集器确实是问题的一部分。我再次尝试了映射读取,似乎根据Instruments中的内存跟踪,它实际上并未使用iStat Menus认为它正在使用的内存量......内存使用量永远不会超过实际内存中10MB的分配量。另外我发现CC_MD5和CC_SHA1都调用CC_MD5_Update和CC_SHA1_Update,所以它们也不会引起问题。问题解决了! :) –