2011-10-06 21 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,所以它們也不會引起問題。問題解決了! :) –