2013-06-18 20 views
1

我有一個應用程序必須將一堆文件從磁盤複製到磁盤。這些文件是HD原始圖像,因此它們很大。我並不懷疑NSFileManager copyItemAtPath:方法實際上會加載內存中的內容以將其複製到目標路徑。iOS:NSFileManager copyItemAtPath是內存密集型

我不得不將隊列中的這些副本任務排隊在最大併發操作數4以避免破壞我的內存過渡配額並避免崩潰,但結果是,我可能需要等待1分鐘才能完成複製所有文件...

他們是一種更有效的方式克隆文件從一個路徑到另一個,而無需加載內存中的內容?

這裏是同時與儀器剖析發生的事情的快照:

enter image description here

在藍色:總活撥款

在粉紅色:在的NSFileManager copyItemAtPath:對記憶的影響。

http://s9.postimg.org/io3654ty7/Screen_Shot_2013_06_18_at_12_43_03_PM.png

回答

-1

的NSFileManager copyItemAtPath:toPath:錯誤:與copyItemAtURL:的toURL:錯誤:您可以使用iOS中複製文件的最低級別的方法。

所以答案是否定的。

+0

'NSFileManager'是一個高級的類。您可以使用各種低級C函數來複制文件。 – rmaddy

+0

我也嘗試使用C調用CopyFile(),但似乎NSFileManager是建立在完全相同的調用之上,所以我有同樣的問題... – smorel

+0

@ user2498023這一切都取決於你如何使用C調用。一種方法是以塊的形式讀取/寫入文件。作爲例子,您可以使用4k緩衝區。因此,在複製文件的任何時候,您的內存使用量不應超過幾千字節。 – rmaddy

0

與註釋相似,但在處理緩衝時使用fopen,fread,fwrite。另外一個非常重要的點 - 你應該在讀寫文件描述符上設置F_NOCACHE平面,否則你將大大增加專用於磁盤緩存的系統內存,如果太大可能會導致你死亡。如果你在文件副本和標誌在這裏搜索,你一定會找到代碼在unix或C標記的項目中執行此操作。

+0

是的謝謝你在純CI管理實施它以獲得對內存使用的更多控制。它只是好奇,默認的基礎會自己流文件:) – smorel

+0

我現在在廣告,但如果你仔細看,你可以得到底層的文件描述符,並設置它的標誌 - 我輸入了一個rdar錯誤缺少這個使用基礎對象但它從未被修復。 –

相關問題