私はWindowsのボックスで大量のデータ処理を実行するシングルスレッドのPythonプログラムを実行しています。私のマシンには8つのプロセッサがあります。 Windowsタスクマネージャの[パフォーマンス]タブでCPU使用率を監視すると、使用可能な処理能力のごく一部しか使用していないことがわかります。 1つのプロセッサだけが最大限に使用されており、残りのすべてがほとんどアイドル状態です。すべてのプロセッサを確実に使用するためにはどうすればよいですか?マルチスレッドはソリューションですか?あなたのマシン上のすべてのプロセッサを使用するようにプログラムするには?
答えて
マルチスレッドでは、プロセッサまたはコアを余分に使用することはできません。
新しいスレッドではなく新しいプロセスを生成する必要があります。
このツールは、はるかに私が遭遇しているものすべてのうち最も単純である: parallel python
概要:
PPがSMPにPythonコードの並列 実行するための機構を提供するPythonモジュールであります (複数のプロセッサを搭載したシステムまたは コア)およびクラスタ(ネットワーク経由でコンピュータ )。
他のpythonソフトウェアとのインストールや統合が簡単です。
PPは
私は自分の返信を簡略化しました。もちろん、コンテキストはPythonでコーディングするので、あなたと他の人が言及した制限があります。 – kakarukeys
並列処理ライブラリに言及した場合は+1 – invert
@Forest:http://us.pycon.org/2010/conference/schedule/event/76/をよく読んで、一般的に保持されている(通常は間違った)知恵を再考して、 GILであっても効率的です。 GILには、理論が想像していることを無視する、本当に珍しい実用的な効果がいくつかあります。 –
がであると仮定すると、スレッド化は確かに解決策です。特に、処理するデータ項目がたくさんある場合は、すべて処理することができます。これは、並列化するのが比較的簡単です。
複数のスレッドの代わりに複数のプロセスを使用する他の解決方法を教えてください。あなたは本当に言うべき問題について十分に話していません。
マルチスレッドは単一のプロセスに必要ですが、必ずしも解決策ではありません。プロセッサアフィニティは、すべてを使用するのに十分なスレッド以上を持っていても、使用可能なコアのサブセットに制限することができます。
あなたは本当に "それは解決策ではありません"または "それは解決策ではないかもしれません"という意味ですか?プロセッサの親和性*は間違いなく問題になりますか? –
@Jon:更新しました。 –
よろしくお願い致します。もっと意味がある。私は問題を引き起こすようなPython内にいくつかの障害が存在するかどうか疑問に思っていました。 –
あなたはあなたのプログラムが型である場合python's multiprocessing module
マルチプロセッシングは、それが持っているPythonのコードでそれらのコアのすべてを使用することが可能ですので、GILの問題を回避し、複数のpythonのプロセスを使用して使用して恩恵を受けることことを得ることができます簡単ねじマップと、より複雑なスキーム
がパイソンを平行に類似しているが、ローカルマシンに制限されているとPython 2.6以降で含まれており、Pythonのは、他のよう
答えを拡大してください。私はあなたが何を言おうとしているのか理解していません。 – invert
をスレッドに比喩的に類似しているための基礎ジョンが言ったことは、あなたが標準のPythonインタプリタでは、マルチスレッドに関する制限を理解する必要があります。スレッドが純粋なPythonでシステムコールを行っていない場合は、Global Interpreter Lockのために複数のプロセッサ上で同時に実行することはできませんので、マルチスレッドへのメリットは最小限に抑えられます。この場合、代わりに複数のプロセスを使用するか、グローバルインタープリタロックを持たないJPythonやIronPythonなどの別のPython実装に切り替えることをお勧めします。
これを行う純粋 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つ以上のコアを使用します。そして、ちょっとしたことで、これは非常に簡単な作業のために驚くほど速くなります。
- 1. Rにすべてのプロセッサを使用するには?
- 2. ネットワーク上のアクティブなすべてのマシンのIPを調べる
- 3. WebLogicでマルチプロセッサマシン上のすべてのプロセッサを使用する方法
- 4. マシン上のすべての* HTTPリクエストにヘッダを追加する
- 5. サブネット上のすべてのマシンにmysqlアクセス権を与える
- 6. 異なるマシン上で動作するプログラムのMakefile
- 7. どのようなフォームが上にあるのか調べるには?
- 8. Pthreadsは複数のプロセッサを使用していないようです
- 9. どのようにすべての上にビューを描画するには?
- 10. .NETプログラムで使用されるxsltプロセッサを変更するには?
- 11. ARQ(Jena用SPARQLプロセッサ)を使用してOntModelインスタンスをTDBなどのように挿入する
- 12. 別のマシンにWindowsプログラムをコピーする
- 13. C#を使用してマシン名を知らなくても、LAN上のすべての共有の名前を見つける方法はありますか?
- 14. javaプログラムを使用してWindowsマシンのすべてのユーザーにフォルダへのフルアクセス許可を与える方法はありますか?
- 15. NHibernateにAppStartUp上のコレクション内のあるクラスのすべてのインスタンスをキャッシュするように指示するにはどうすればよいですか?
- 16. あなたのマシンでどのアルゴリズムcrypt()が使われているか調べるには?
- 17. Rubyを使用しているすべてのSoftLayerマシンの注文usernameとprovisionDateを取得するには?
- 18. は、私はそのようなルートを持っているプロセッサ
- 19. 同じマシン上の異なるプロジェクトに対して、2つの異なるバージョンのDjangoをどのように使用できますか?
- 20. ペーパークリッププロセッサ - 私自身のプロセッサでpaperclip loggerを使用するには?
- 21. 同じマシン上の異なるポートを使用する2つのサイトで同じAppPoolを使用することに問題はありますか?
- 22. データフレーム上のすべての行に関数を適用するにはどうすればよいですか?
- 23. ARMプロセッサを使用する方法はありますか?
- 24. ローカルネットワーク上の他のマシンで.NET 4.0 Webサービスを使用できるように設定するにはどうすればよいですか?
- 25. マシン上で実行されているすべてのwcfサービスのリストを取得するには?
- 26. あなたのマシン上のSphinxを検出できないため、使用しようとしているSphinxのバージョンを判断できません
- 27. UNIXソケットを使用して同じホスト上のあるプログラムから別のプログラムにファイル記述子を渡す
- 28. 仮想マシン内の物理プロセッサの数を取得する
- 29. javaを使用してLinux上で利用可能なすべてのシリアルポートのリストを取得するには?
- 30. マシン上でJavaがすべてのCPUパワーを使用する方法を教えてください。
はいマルチスレッドが必要です。 – cspolton
あなたのプログラムの説明がなくても、 –
のマルチスレッディングは必須ではないかどうかは言えません。 –