2011-09-09 16 views
4

大きなファイル/フォルダの束をある場所からデスクトップ上の別の場所にコピーするPythonコードを書いています(ネットワークなし、すべてがローカルです)。私はそのためにshutilモジュールを使用しています。並行ファイルコピー操作のためのPythonマルチプロセス/マルチスレッドの使用

しかし、このコピープロセスのスピードを上げるために時間がかかるという問題があります。私はスレッドとマルチプロセッシングモジュールを使ってみました。しかし、私の驚いたことに、どちらもシーケンシャルなコードよりも時間がかかります。

もう1つの観察は、同じ数のフォルダのプロセス数が増えるにつれて、必要な時間が長くなることです。私が意味することは、ディレクトリ構造に従っているとします。

     /a/a1, /a/a2, /b/b1 and /b/b2 

フォルダaとbをコピーする2つのプロセスを作成すると、2分と仮定します。 フォルダa/a1、a/a2、b/b1、b/b2をコピーするプロセスを4つ作成すると、約4分かかります。私はスレッド処理については不明なマルチプロセッシングでのみこれを試しました。

私は何が起こっているのか分かりません。誰にも同様の問題があったでしょうか? Pythonでマルチプロセッシング/スレッドを使用するために共有できるベストプラクティスはありますか?

おかげ Abhijit

+4

あなたの問題はIOバウンドの可能性が高いため、より多くの並列化が役に立ちません。あなたが見てきたように、IO要求がさまざまなスレッド/プロセス間を行き来するように要求することによって、おそらく問題が悪化しています。データがコンピュータ上でどのくらい速く移動できるか、特にディスクが関係している場合は、実際的な制限があります。 – Joe

+1

@Joeそれは答えです。それを一つに移動すれば、私の投票権が得られる。 – agf

+0

複数のプロセスがディスクの複数のヘッドを高速化するためには、独立して動作する必要があります。しかし、それは彼らがどのように働くかではありません。 –

答えて

8

あなたの問題は、それほど多くの計算並列化は助けにはなりません、IOバウンド可能性があります。あなたが見てきたように、IO要求がさまざまなスレッド/プロセス間を行き来するように要求することによって、おそらく問題が悪化しています。データがコンピュータ上でどのくらい速く移動できるか、特にディスクが関係している場合は、実際的な制限があります。

+0

答えてくれてありがとうジョー。私はそれがIOバインドの問題かどうかはわかりません。しかし、実際には、特定のOSとハードウェアのためにディスク上のデータを移動させるという現実的な限界があります。私はただそれを限界まで使うことを確かめたかったのです。私はOSのコピーコマンドを使ってシーケンシャルコピーとパラレルコピーを試み、どちらの場合もPythonのシーケンシャルコピーと同じ時間がかかることに気付きました。 –

+1

IOバインドされています... – fabrizioM

関連する問題