問題タブ [python-multiprocessing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 組み合わせの並列化 python
以下のコードを並列化すると、attributes 列の要素数が 15 近くあるため、結合に時間がかかります。
マルチプロセッシングを使用して並列化する方法はありますか?
これを試しましたが、このエラーが発生しています。- チャンクサイズ <= 0 の場合:
TypeError: 順序付けできない型: range() <= int()
質問の説明を求められたので、どうぞ・・・。基本的にn!. たとえば、属性変数に A、B、C がある場合、(A)、(B)、(C)、(A、B)、(A、C)、(A、B、 C)。属性の要素数は静的ではなく、入力データセットに基づいて変化するため、ハードコーディングできません。したがって、ここでは len(attributes) を使用しています。属性はデータセットの属性を格納します。次に、組み合わせを作成するために、 itertools.combinations(attributes,L) は通常、長さ L のすべての組み合わせを作成します。私の例では、長さ (attributes) を指定すると、ABC のみが取得され、他の組み合わせは取得されません。だから私は長さの範囲を作成し、それを1つ追加してゼロ番目の要素に取り組みました。
問題に戻ると、データセットに 15 個の要素が含まれている可能性があるため、長さ (属性) は 15、つまり 15! になります。この階乗を行う必要があるため、この組み合わせの生成には多くの時間がかかります。したがって、各プロセッサが一度に 1 つの組み合わせセットの生成を処理する方法でこれを並列化することを考えています。たとえば、1 つのプロセッサが長さ 2 と長さ 3 のすべての組み合わせを生成します。複数の引数を適切に渡すことができません。これで状況が解決することを願っています。さらに説明が必要な場合はお知らせください。
python - ElementTree 並列ノードの作成
グラフ オブジェクトを xml 表現に書き込んでいます。私のモノリシック コードはうまく機能しますが、大きなグラフでは遅すぎます。私はそれを並列化しようとしていSubElement
ますが、プールから戻ってきません。明らかな何かが欠けていると確信していますが、私はpythonが初めてです。
python - Python マルチプロセッシングとデータのシリアル化
モジュールを使用して、学校のコンピューターでスクリプトを実行していmultiprocessing
ます。データを頻繁にシリアライズしています。以下のコードで要約できます。
そのため、実際にコードをさらに多くのシミュレーションで実行し、より集中的なさまざまなタスクであると想像すると、次のエラーが発生します。IOError: [Errno 5] Input/output error
通常、file.open(...)
またはが前に付いていfile.close()
ます。
私の質問:
- スクリプトでこのエラーを修正するにはどうすればよいですか?
- このエラーは Python 初心者にとって何を意味しますか? 参考にさせていただきます。
私の手順に関するいくつかの注意事項:
- multiprocess 属性
daemon
をに設定する代わりにTrue
、screen を使用してスクリプトを実行し、デタッチします。これにより、スクリプトが停止することを心配せずに切断することもできます。 - これは、モジュールを使用した印刷に関する関連する質問のようです。
subprocess
私が言ったようにデーモンを明示的に使用しなかったので、これが役立つかどうかはわかりません。 - これは通常、約 1 日実行した後に発生し、さまざまなプロセスでさまざまな時間に発生します。
python - 2 つの異なるマシンでの Python マルチプロセッシング プールのパフォーマンスの違い
そのため、同じ Python 仮想環境内の 2 つの異なるマシンに同じコードをデプロイしました。OS/カーネルはまったく同じで、ハード ドライブ モデルも同じです。2 つのマシンの唯一の大きな違いは CPU です。マシン 1 には 2 つの Xeon E5-2690 (16 コア @ 2.90 GHz) があり、マシン 2 には 1 つの Xeon W3690 (3.47 GHz で 6 コア) があります。
ここで、マルチプロセッシング プールを使用しないバージョンのコードを実行すると、マシン 1 がより高速に実行されます。ただし、マルチプロセッシング プールを使用すると、マシン 2 の実行速度が大幅に向上します (6 倍以上)。実際、マシン 1 は、作成するスレッドの数に関係なく、シングル スレッド バージョンよりもそれほど速くは実行されません。
問題のプロセスは、HDF5 ファイルを読み取り、データに対していくつかの基本的な数学演算を実行するだけです。
strace -c を実行するように提案されました。私の結果は、マシン 1 の futex にもう少し時間が費やされていることを示しています。
この問題は、マルチプロセッシングによって作成されるオーバーヘッドに関連していると確信していますが、それはかなり大きな違いです。また、0.57 GHz がこれほど大きな不一致を引き起こすとは信じがたいです。何か案は?
ありがとう!
編集:
したがって、IOを処理せずに実行したテストは次のとおりです。
マシン 1:
マシン 2:
python - lxml etree オブジェクトを別のプロセスに渡すことができません
lxmlを使用してPythonで複数のxmlファイルを同時に解析するプロジェクトに取り組んでいます。プロセスを初期化するとき、etree オブジェクトをプロセスに渡す前に、メイン クラスで XML に対していくつかの作業を行う必要がありますが、etree オブジェクトが新しいプロセスに到着すると、クラスは存続しますが、XML はなくなっています。 getroot() は None を返します。
キューを使用して選択可能なデータのみを渡すことができることはわかっていますが、これは「args」フィールド内のプロセスに渡すものにも当てはまりますか?
これが私のコードです:
ありとあらゆる助けが大歓迎です。
更新/回答
次の投稿の回答に基づいて、少し変更し、String IO を使用せずにメモリ フットプリントを大幅に削減して動作させることができました。etree.tostring メソッドはバイト配列を返します。これは pickle 化できます。次に unpickle するには、バイト配列を etree で解析できます。
更新 2
メモリでベンチマークを行った後、大きなオブジェクトを渡すと、メイン プロセスのガベージ コレクションによってオブジェクトをクリアできなくなることがわかりました。これはおそらく小規模では問題ではありませんが、etree オブジェクトはメモリ内で数百 MB のオーダーでした。ステートメントで XML オブジェクトを使用して非同期タスクが呼び出されるとすぐに、そのオブジェクトがメイン プロセスから削除されても、手動でガベージ コレクションを呼び出しても、そのオブジェクトをメモリからクリアできません。その結果、メイン プロセスで XML を閉じ、ファイル名をサブプロセスに渡すことに戻りました。
python - Python マルチプロセッシングでは LDAP オブジェクトをサブプロセスと共有できません
LDAP クエリを送信する 1 つのサブプロセスと、応答を取得する別のサブプロセスを作成します。両方のプロセス間で LDAP オブジェクトを共有すると問題が発生します。誰かが私に解決策を教えてもらえますか?
エラーは pickle モジュールにあります:
python - Python マルチプロセッシング モジュール: タイムアウト付きのプロセスに参加する
複雑なシミュレーションのパラメーターの最適化を行っています。最適化アルゴリズムのパフォーマンスを向上させるために multiprocessing モジュールを使用しています。http://pymotw.com/2/multiprocessing/basics.htmlで学んだ multiprocessing の基本。複雑なシミュレーションは、最適化アルゴリズムから与えられたパラメーターに応じて、さまざまな時間 (約 1 ~ 5 分) 続きます。パラメータの選択が非常に悪い場合、シミュレーションは 30 分以上続く可能性があり、結果は役に立ちません。そこで、マルチプロセッシングにタイムアウトを組み込むことを考えていました。これにより、定義された時間以上続くすべてのシミュレーションが終了します。問題の抽象化されたバージョンは次のとおりです。
行p.join(5)
は 5 秒のタイムアウトを定義します。forループfor p in procs:
のため、プログラムは最初のプロセスが終了するまで5秒間待機し、2番目のプロセスが終了するまで5秒間待機しますが、5秒以上続くすべてのプロセスをプログラムに終了させたいです。さらに、どのプロセスも 5 秒以上継続しない場合、プログラムはこの 5 秒間待機してはなりません。