2009-08-09 83 views
0

我正在研究一個涉及一些SFTP功能的小型免費Cocoa應用程序,專門用於上傳。該應用程序即將完成,但我已經遇到了上傳包含大量文件的文件夾方面的一個相當不好的問題。處理非常大的SFTP上傳 - Cocoa

我使用ConnectionKit處理上傳:

CKTransferRecord * record; 
record = [connection recursivelyUpload:@"/Users/me/large-folder" 
            to:@"/remote/directory"]; 

這工作適合大多數文件和文件夾。儘管在這種情況下@「/ Users/me/large-folder」裏面有300多個文件。調用這種方法使我的CPU高達100%達30秒左右,並且我的應用程序沒有響應(mac旋轉球)。在30秒後,我的上傳排隊並正常工作,但這並不理想。顯然無論枚舉這些文件是否導致我的應用程序鎖定,直到完成。

不知道該怎麼辦。我接受任何解決方案 - 即使使用不同的框架,儘管我已經完成了我的研究,並且ConnectionKit似乎是最好的解決方案。

任何想法?

回答

1

使用鯊魚。開始採樣,開始下載,一旦掛起,停止採樣。

如果輸出確認問題是出在ConnectionKit,你有兩個選擇:

  1. 切換到別的東西。
  2. 貢獻一個使其不掛起的補丁。

開源的美是#2是可能的。這是我的建議。那麼,你不僅會擁有一個快速的ConnectionKit,而且一旦維護人員接受你的補丁,其他所有使用CK的人也可以擁有一個。

如果鯊魚揭示的問題是在ConnectionKit不(規則#2分析的:你驚訝),那麼你有鯊魚就如何解決您的應用程序的指導。

1

由於問題幾乎肯定存在於枚舉上,因此您可能需要將枚舉移動到異步操作中。很可能他們正在使用NSFileManager -enumeratorAtPath:。如果這是主要問題,那麼最好的解決方案可能會將這項工作轉移到自己的線程上。鑑於涉及的時間很長,我懷疑他們實際上是在枚舉期間閱讀文件。解決方案是在上傳之前懶懶地閱讀文件。

彼得是正確的,鯊魚是有幫助的,但作爲一個長期的鯊魚粉絲,我發現儀器往往會提供更多更有用的答案更快。您可以使用儀器更輕鬆地將磁盤I/O和內存分配軌道添加到CPU採樣器。

如果您僅阻止100%的內核,我建議將活動線程設置爲「主線程」,並將「示例透視圖」設置爲「所有示例計數」。如果您以100%的速度阻止所有內核,我建議將活動線程設置爲「所有線程」並將示例透視設置爲「運行示例時間」。

+0

將枚舉移動到它自己的線程上,阻止了程序鎖定,但是我仍然在100%的CPU期間運行。你能解釋一下「懶惰地」閱讀文件的意思嗎? – nrj 2009-08-11 15:32:03

+0

這意味着儘可能晚地閱讀文件。在這種情況下,它意味着在您準備上傳文件之前不會讀取文件。我懷疑他們在枚舉期間正在讀取所有文件,這可能不是一個好時機。如果有必要,NSFileHandle有例程在後臺讀取並在完成讀取時通知您。 – 2009-08-11 23:43:06