2012-04-12 19 views
4

私はPythonスクリプトを使用して、指定されたディレクトリを再帰的に処理し、見つかった各ファイルをチェックサムします。次に、すべてのファイルパスとそのmd5チェックサムを一覧表示するログファイルを書き込みます。Pythonのマルチスレッド化MD5チェックサム

これは、15,000個のファイルでそれぞれ50,000個のファイルが処理されるまでに時間がかかります。しかし、私のコンピュータは、実際に使用しているよりもはるかに多くのリソースを利用できます。スクリプトがより多くのリソースを使用してより速く実行できるように、私のアプローチを調整するにはどうすればよいですか?

たとえば、ファイルリストを3番目に分割し、それぞれのスレッドを実行して3xランタイムを与えることはできますか?

私はスレッディングにはあまり慣れていません。ここで

は私のシーケンシャルMD5ループのコードは次のとおりです。事前にあなたの助けを

for (root, dirs, files) in os.walk(root_path): 
    for filename in files: 
     file_path = root + "/" + filename 
     md5_pairs.append([file_path, md5file(file_path, 128)]) 

ありがとう!この種の仕事のために

+3

最も単純な方法は、pythonスクリプトのインスタンスを個別に起動することです。各インスタンスにroot_pathのサブツリーが与えられます。 – TJD

+3

最適化を実行する前にまずボトルネックがどこにあるかを調べることをお勧めします。たとえば、MD5がディスクからファイルを読み込むよりも大幅に少ない場合は、スピードアップの点であまり期待しないでください。 – SquareRootOfTwentyThree

+0

これは素晴らしい点です。シンプルな読み取りとチェックサムのベンチマークを行い、チェックサムはランタイムに約10%しか追加しませんでした。当社のファイバー接続SANは8Gb/sで読み取ります。私はそれらのファイルをより速く読むことができると思うでしょうか?合計7 GBの600ファイルを読み込むには、88秒かかります。 – Jamie

答えて

5

、私はmultiprocessing.Poolはあなたにあまり驚きを与えるだろうと思う - あなたがスレッドを使用するつもりならhttp://docs.python.org/library/multiprocessing.html

+1

こんにちはjsbueno、私は提案としてプールを使ってみましたが、それは20%だけランタイムを改善しました。これは良いでしょうか?私はたくさんの小さなファイルを扱っているので、ファイルリストを複数の塊に分割し、各塊をプールに送る方が良いでしょうか?または、個々のmd5コールをプールに送信するのが最善でしょうか? – Jamie

+0

20%以上のスピードアップが見られない理由は、処理がCPUバウンドではなくIOバウンドである可能性があるからです。理論的には、計算部分で100%の効率を得ることができるはずなので、これが当てはまるかどうかを調べるために何らかのプロファイリングを行う必要があります。 –

+1

もしバインドされていれば、メインプロセス(または他のプロセス)のすべてのファイルを読み込んでRAMに読み込むだけで、物事を改善することができます。そして、各md5のプロセスは、ディスク*と* md5からロードする必要はありません。md5にするだけです。 (もちろんこれについての記憶があると仮定します) – quodlibetor

0

で例やドキュメントをチェックし、あなたのスレッドを最初に開始する必要があり、 Queue.Queueインスタンスから作業をポーリングします。次にメインスレッドで、forループを実行しますが、md5file(..)の代わりにQueue.Queueのすべての引数を押します。 Threading/Queue in Pythonは例がありますが、同様のドキュメントを見て:GIL(グローバルインタプリタロック)あなたのアプリケーションがでmd5.update関数に複数の呼び出しを実行することはないんhttp://docs.python.org/library/queue.html

0

スレッドは非常に有用ではないでしょう同時。私はあなたのプロセスプールを改善しようと努力し続けます。

+1

md5fileがディスクから読み込む場合、これは当てはまりません。 GILはディスクIO中に保持されません。つまり、スレッド化はスループットの問題よりもレイテンシの問題に対する優れた解決策です... – thebjorn

+0

ええ、私は間違った用語を使用していると思います。私が望むと思うのは、マルチスレッドではなくマルチプロセッシングです。右? – Jamie

+1

IOバインディングが大幅に増えても大きな違いはありませんが、_in_general_マルチプロセッシングはPythonでより多くのCPUコアを利用する正しい方法です。 – thebjorn

0

並行して並行して、ファイルのまとまりのプロセスを開始します。我々はクラスタ上でこれを行う。あなたは、数十のファイルを作成する何十、何百ものプロセスを持つことができます。その時点で、ディスクIOがボトルネックになります。

関連する問題