2010-11-19 15 views
5

Jythonでマルチスレッド化/並列化のボトルネックとなる可能性がある一般的な隠れたものは何ですか?私は過去3-4のCPUをスケーリングしません(Pythonのスレッドライブラリを使用して)いくつかの並列コードを持っている、と私はそれがあるため、これらの明白な落とし穴のいずれかではないと確信している:Jythonで隠されたマルチスレッドのボトルネック?

  • 明示的なロック

  • 同期を必要とするライブラリのコード(私は並列化しようとしているアルゴリズムは、基本的にゼロから作成されており、すべてのライブラリを使用しません。)

基本的にすべてのアルゴリズムはありませんを呼び出すと、文字列処理の束で、リスト辞書ルックアップと数学。私の理解では、CPythonとは異なり、JythonにはGILがありません。

+0

ガベージコレクションがJVMレベルであなたを傷つけているかどうかを確認します。このドキュメントには、これに関する多くの情報があります。http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html –

答えて

3

JythonにはGILはありませんが、多くの並列性を得るのはかなり難しいです。あなたが並行して行うことができない任意の部分を持っている場合は、Ahmdahl's Lawで刺さ:

並列コンピューティングでは、複数のプロセッサを使用して、プログラムの高速化は、プログラムのシーケンシャルな割合のために必要な時間によって制限されます。

また、純粋な並列計算を行っても、キャッシュを酷使するなどの他のものによって噛まれることになります。また、コードが仮想マシン上で実行されていることを覚えておいてください。コードが純粋に並列であっても、JVMには内部的な調整が必要な場合があります(ガベージコレクションは明らかです)。

4

変数へのアクセスは、「隠れた」ボトルネックの1つです。すべてのスレッドがいくつかの共有データ構造にアクセスすると、スレッド間で同期が行われます。

JythonはCPythonとの言語互換性を達成しようとします。 GILが保証することの1つは、ローカル/グローバル変数、オブジェクト・メンバー、dict要素(技術的にはローカル、グローバルおよびオブジェクト・メンバーもdict要素です)へのアクセス、またはリスト要素さえもアトミックであることです。ユーザーの驚きを避けるために、Jythonは同時ハッシュマップを使用してdictを実装しています。これは、Jythonの任意の種類のdict要素にアクセスするときに何らかの同期が行われていることを意味します。このsycnhronizationは、それらをブロックせずに複数のスレッドからdictへのアクセスをサポートするようにストライプ化されていますが、複数のスレッドが同じ変数にアクセスする場合、同じロックにヒットします。

Jythonおよびその他の言語でスケーラビリティを実現する最も良い方法は、各スレッドでアクセスしているデータに他のスレッドからもアクセスしないようにすることです。

1

performance analysisパッケージを試しましたか?彼らがJythonのために明示的ではないとしても、私はそれがいくつかの助けを与えるだろうと確信しています。

ライセンスにアクセスできる場合は、まずYourKitを試してみます。

関連する問題