問題タブ [concurrent-processing]
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で各スクリプトに複数のスレッドがある場合、マスタースクリプトから2つのスクリプトを同時に実行する
から 2 つ以上の Python スクリプトを同時に実行したいmaster script
。これらの各スクリプトには、並行して実行されるスレッドが既に含まれています。たとえば、私は実行します
script1.py
script2.py
私はこれscript1.py
と script2.py
別々に実行しています。唯一の違いは、クラスに渡すパラメーターです。それを実行すると、これらの両方のスクリプトが実行されるようなマスタースクリプトを持つことは可能ですか?
ありがとう
python - マルチプロセッシングまたはレイを使用して、他の CPU バウンド タスクと同時にファイルを書き込む
私は 72 コア (実際には 36 個のマルチスレッド CPU で、72 コアとして表示されていますmultiprocessing.cpu_count()
) のワークステーションを持っています。
何百万もの小さなファイルのバッチで、同時処理の両方を試しmultiprocessing
ましray
たが、その処理中にいくつかの出力ファイルを同時に書きたいと思います。
たとえば(in .get()
)および.apply_async()
multiprocessing
ray.get()
には、ループ内でデータのグループを並列に処理ray
するリモート関数 ( ) があります。process_group()
以下では、モジュールを使用するコードのバージョンmultiprocessing
もコメントとして示します。
したがって、各ループ反復では、1 つのより大きなデータフレームに連結するためprocess_group()
のデータフレームのリストとして、同時に計算された many の出力を収集する必要があります。後者はディスクに書き込む必要があります (通常、サイズは ~1 から ~3 GB です)。このようなファイルを 1 つ書き込むと、リモートが処理されるまでに時間がかかります。何千ものループ反復があります。そのため、完了するまでに数日かかります。df_list
very_big_df
10-30 [s]
180 [s]
process_group
時間の約 10% を節約するためにループを継続しながら、ファイルを非ブロッキング方式でディスクに書き込むことは可能ですか (計算時間を約 1 日節約できます)。
次のループ反復の並行プロセスが終了するまでに、前の反復からの出力を書き込むのに十分な時間があります。ここに含まれるコアはすべてほぼ 100% で動作しているように見えるため、このThreading
モジュールもおそらく推奨されません。multiprocessing.apply_async()
選択できない出力データフレームが必要ないため、さらにイライラしますvery_big_df
。これは、節約しようとしている時間を犠牲にする可能性のある、より洗練されたものと共有する必要があり、そのray
ようなものを効率的に処理することを望んでいました.
[更新] 簡単にするために、すべてのプロセスに大きな共有変数があることについては言及しませんでした (これが、ファイルの同時書き込みと同様に、並列プロセスと呼んだ理由です)。その結果、タイトルの質問が編集されました。実際には、レイ並列ジョブの前に次のコードがあります。
ただし、それが同時操作だけでなく、「並列」実行のようになるかどうかはわかりません。
[UPDATE 2] 共有配列はルックアップ テーブルです。つまり、並列ワーカーに関する限り、読み取り専用です。
[更新 3] 提案された両方の解決策を試しました: Threading と Ray / compute()ブロックインになる.get()を介して。
したがって、Ray では、これは両方のソリューションを示しています。
RAY ソリューションの場合、これは object_store_memory を増やすために必要でしたが、デフォルトでは十分ではありませんでした: ノード メモリの 10% ~ 37 GB (私は 376 GB の RAM を持っています) で、20 GB で上限があり、保存されているオブジェクトのみが合計で約 22 GB です:データフレームの 1 つのリストdf_list
(約 11 GB)、および書き込み関数内でのそれらの連結の結果 (約 11 GB)。連結中にコピーがあると仮定します。そうでない場合、このメモリの問題は意味がなく、デフォルトで発生していると思っていた numpy ビューを渡すことができるかどうか疑問に思います。これは、それぞれがどれだけのメモリdf_list
になるかを実際に予測できないため、RAY のかなり苛立たしい側面です。1 倍から 3 倍まで変化する可能性があります...
最終multiprocessing
的に、処理部分 (I/O なし) が高速になるため、スレッド化に固執することが最も効率的なソリューションになります。
各ループ反復では、通常len(many_data_lists) = 7000
、各リストにはサイズ (3, 9092) の 7 つの numpy 配列が含まれます。したがって、これらの 7000 個のリストが 60 個のワーカーに送信されます。
process_group
ループ反復ごとのすべての並列の時間:
レイ:250 [s]
マルチプロセッシング:233 [s]
I/O: 5 GB の寄木細工ファイルが外部 USB 3 回転ディスクに書き込まれるのに約 35 秒かかります。内部回転ディスクで約 10 秒。
Raywrite_to_parquet.remote()
:ループをブロックする未来を作成するための最大 5 秒のオーバーヘッド。これは、回転するディスクに書き込むのにかかる時間の 50% です。これは理想的ではありません。
multiprocessing : 0 秒のオーバーヘッドが測定されました。
総経過時間:
レイ:486 [s]
マルチプロセッシング:436 [s]
これを数回繰り返しましたが、レイとマルチプロセッシングの違いは、一貫してマルチプロセッシングが最大50 秒高速であることを示しています。これは大きな違いであり、 Rayがより高い効率性を宣伝しているため、不可解でもあります。
これをより長い反復回数実行し、安定性 (メモリ、ガベージ コレクションの潜在的な問題など) について報告します。
c++ - 異なるスレッドが一緒に配列を埋める方法は?
並行して実行したいいくつかのタスク (モンテカルロ シミュレーション) があるとします。特定の数のタスクを完了したいのですが、タスクによって時間がかかるため、作業をスレッドに均等に分割するのは簡単ではありません。また、最後にすべてのシミュレーションの結果を単一のベクトル (または配列) にする必要があります。
だから私は以下のアプローチを思い付きます:
上記のコードは、私が推測する競合状態を引き起こします。それを回避するためのパフォーマンスの高いアプローチを探しています。要件: 競合状態を回避します (配列全体を埋める、スキップしない)。最終結果はすぐに配列になります。パフォーマンス。
さまざまなアプローチを読んで、アトミックが良い候補のようですが、私の場合、どの設定が最もパフォーマンスが高いかわかりませんか? そして、アトミックがそれをカットするかどうかさえわかりません。おそらく、LastAdded を保護するミューテックスが必要ですか?