2009-08-09 12 views
0

私は、SFTP機能を含む小さな無料のCocoaアプリケーション、特にアップロードを処理しています。アプリが完成に近づいていますが、たくさんのファイルを含むフォルダをアップロードすることに関してかなり悪い問題に遭遇しました。非常に大きなSFTPアップロードを処理する - ココア

私がアップロードを処理するためにConnectionKitを使用しています:

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

これは、ほとんどのファイルとフォルダのため正常に動作します。この場合、@ "/ Users/me/large-folder"には300個以上のファイルがあります。このメソッドを呼び出すと、約30秒間CPUが最大100%回転し、アプリケーションが応答しなくなります(Mac回転ボール)。 30秒後に私のアップロードが待ち行列に入り、正常に動作しますが、これはほとんど理想的ではありません。明らかにこれらのファイルを列挙しているものは、完了するまで私のアプリケーションをロックアップさせてしまいます。

これについてどうすればよいか分かりません。私は私の研究を行っていますが、ConnectionKitはそこにあるものの中で最高のようですが、私はちょうどどんな解決策にもオープンしています。

アイデア?

答えて

1

サメを使用してください。サンプリングを開始してダウンロードを開始し、ハングが終了するとすぐにサンプリングを停止します。

出力は問題がConnectionKitであることを確認した場合、次の2つの選択肢があります:他の何かに

  1. スイッチ。
  2. ハングしないパッチを提供します。

オープンソースの美しさは#2が可能です。それは私が推奨するものです。それでは、あなたは高速のConnectionKitを持っているだけでなく、メンテナがあなたのパッチを受け入れると、CKを使っている人は誰もがそれを持つことができます。

サメは問題がConnectionKitに(プロファイリングのルール#2:あなたは驚かれることでしょう)でないことが明らかになった場合、あなたはあなたのアプリケーションを修正する方法についてのシャークス指導を持っています。

1

問題はほぼ確実に列挙されているため、列挙を非同期アクションに移動する必要があります。おそらく彼らはこれにNSFileManager -enumeratorAtPath:を使用しています。それが主な問題である場合、最良の解決策は、その作業を自分のスレッドに移す可能性が高いことです。非常に長い時間を要すると、彼らは列挙中にファイルを実際に読み取っていると思われます。その解決方法は、アップロードする直前に遅延読み込みを行うことです。

ピーターはシャークが役に立つと思っていますが、長年サメのファンであった後、インストゥルメントはより使いやすい回答をより迅速に提供する傾向にあることがわかりました。インストゥルメントを使用して、CPUサンプラーにディスクI/Oとメモリ割り当てトラックを簡単に追加できます。

コアを1つだけ100%ブロックする場合は、アクティブスレッドを「メインスレッド」に設定し、サンプルパースペクティブを「すべてのサンプル数」に設定することをおすすめします。すべてのコアを100%でブロックしている場合は、アクティブスレッドを「すべてのスレッド」に設定し、サンプルパースペクティブを「サンプル時間を実行する」に設定することをお勧めします。

+0

列挙を自分のスレッドに移動すると、プログラムがロックされなくなりましたが、その間に100%CPUで実行しています。ファイルを「怠惰に」読むことが何を意味するのか説明できますか? – nrj

+0

可能な限り遅くファイルを読むことを意味します。この場合、アップロードする準備が整うまでファイルを読み込まないことを意味します。私は列挙中にすべてのファイルを読み込んでいると思われますが、これはおそらくそれを行う良い時期ではありません。必要であれば、NSFileHandleにはバックグラウンドで読み込みを行い、読み終わったときに通知するルーチンがあります。 –

関連する問題