2010-12-01 5 views
5

私はWindowsのボックスで大量のデータ処理を実行するシングルスレッドのPythonプログラムを実行しています。私のマシンには8つのプロセッサがあります。 Windowsタスクマネージャの[パフォーマンス]タブでCPU使用率を監視すると、使用可能な処理能力のごく一部しか使用していないことがわかります。 1つのプロセッサだけが最大限に使用されており、残りのすべてがほとんどアイドル状態です。すべてのプロセッサを確実に使用するためにはどうすればよいですか?マルチスレッドはソリューションですか?あなたのマシン上のすべてのプロセッサを使用するようにプログラムするには?

+1

はいマルチスレッドが必要です。 – cspolton

+0

あなたのプログラムの説明がなくても、 –

+0

のマルチスレッディングは必須ではないかどうかは言えません。 –

答えて

6

マルチスレッドでは、プロセッサまたはコアを余分に使用することはできません。

新しいスレッドではなく新しいプロセスを生成する必要があります。

このツールは、はるかに私が遭遇しているものすべてのうち最も単純である: parallel python

概要:

PPがSMPにPythonコードの並列 実行するための機構を提供するPythonモジュールであります (複数のプロセッサを搭載したシステムまたは コア)およびクラスタ(ネットワーク経由でコンピュータ )。

他のpythonソフトウェアとのインストールや統合が簡単です。

PPは

+1

私は自分の返信を簡略化しました。もちろん、コンテキストはPythonでコーディングするので、あなたと他の人が言及した制限があります。 – kakarukeys

+0

並列処理ライブラリに言及した場合は+1 – invert

+0

@Forest:http://us.pycon.org/2010/conference/schedule/event/76/をよく読んで、一般的に保持されている(通常は間違った)知恵を再考して、 GILであっても効率的です。 GILには、理論が想像していることを無視する、本当に珍しい実用的な効果がいくつかあります。 –

1

であると仮定すると、スレッド化は確かに解決策です。特に、処理するデータ項目がたくさんある場合は、すべて処理することができます。これは、並列化するのが比較的簡単です。

複数のスレッドの代わりに複数のプロセスを使用する他の解決方法を教えてください。あなたは本当に言うべき問題について十分に話していません。

+0

実際に複数のプロセス*は、同じプロセスの複数のスレッドを複数のコアに分散することは、特定のプラットフォーム/ OSではサポートされない可能性があるため、最も一般的な解決策です。 – knitti

+0

@knitti:質問は特にWindowsについてです。複数のプロセスを使用すると、スレッドがあまりにも悪くないという不可能なポイントに不便になることがあります。 –

+0

申し訳ありませんが、私は明らかに読書スキルを磨く必要があります...しかし好奇心から:なぜあなたは複数のプロセスが不便であると思いますか? – knitti

2

マルチスレッドは単一のプロセスに必要ですが、必ずしも解決策ではありません。プロセッサアフィニティは、すべてを使用するのに十分なスレッド以上を持っていても、使用可能なコアのサブセットに制限することができます。

+0

あなたは本当に "それは解決策ではありません"または "それは解決策ではないかもしれません"という意味ですか?プロセッサの親和性*は間違いなく問題になりますか? –

+0

@Jon:更新しました。 –

+0

よろしくお願い致します。もっと意味がある。私は問題を引き起こすようなPython内にいくつかの障害が存在するかどうか疑問に思っていました。 –

2

あなたはあなたのプログラムが型である場合python's multiprocessing module

マルチプロセッシングは、それが持っているPythonのコードでそれらのコアのすべてを使用することが可能ですので、GILの問題を回避し、複数のpythonのプロセスを使用して使用して恩恵を受けることことを得ることができます簡単ねじマップと、より複雑なスキーム

がパイソンを平行に類似しているが、ローカルマシンに制限されているとPython 2.6以降で含まれており、Pythonのは、他のよう

+0

答えを拡大してください。私はあなたが何を言おうとしているのか理解していません。 – invert

2

をスレッドに比喩的に類似しているための基礎ジョンが言ったことは、あなたが標準のPythonインタプリタでは、マルチスレッドに関する制限を理解する必要があります。スレッドが純粋なPythonでシステムコールを行っていない場合は、Global Interpreter Lockのために複数のプロセッサ上で同時に実行することはできませんので、マルチスレッドへのメリットは最小限に抑えられます。この場合、代わりに複数のプロセスを使用するか、グローバルインタープリタロックを持たないJPythonやIronPythonなどの別のPython実装に切り替えることをお勧めします。

1

これを行う純粋 Pythonで書かれたオープンソースとクロスプラットフォーム・モジュールです。

タスクを段階または段階に分割します。各ステップは何かを読み、全体の計算の一部を行い、何かを書きます。

"""Some Step.""" 
import json 
for some_line in sys.stdin: 
    object= json.loads(some_line) 
    # process the object 
    json.dump(result, sys.stdout) 

何かがうまくいくはずです。

コミュニケーションが必要な複数のオブジェクトがある場合は、そのオブジェクトの単純な辞書を作成します。

results = { 'a': a, 'b': b } 

このようにパイプラインで接続します。

python step1.py | python step2.py | python step3.py >output_file.dat 

8つ以上の手順で問題を解決できる場合は、8つ以上のコアを使用します。そして、ちょっとしたことで、これは非常に簡単な作業のために驚くほど速くなります。

関連する問題