モジュールと並列化したい「恥ずかしいほど並列な」プロジェクトがたくさんありmultiprocessing
ます。ただし、多くの場合、巨大なファイル (2 GB を超える) の読み取り、行ごとの処理、基本的な計算の実行、および結果の書き込みが必要になります。ファイルを分割し、Python の multiprocessing モジュールを使用して処理する最良の方法は何ですか? 使用する必要がありますQueue
か?それともモジュール自体?または、を使用してプロセスのプールに反復可能なファイルをマップする必要がありますか? これらのアプローチを試してみましたが、行ごとにデータを分散させるとオーバーヘッドが膨大になります。私は、最初のプロセスの特定の割合を通過するを使用して、軽量のパイプ フィルター設計に落ち着きました。JoinableQueue
multiprocessing
Queue
multiprocessing
cat file | process1 --out-file out1 --num-processes 2 | process2 --out-file out2
)、しかし、Pythonに完全に含まれるソリューションが欲しい.
驚いたことに、Python のドキュメントでは、これを行う標準的な方法は提案されていません (multiprocessing
ドキュメントのプログラミング ガイドラインに関する長いセクションにもかかわらず)。
ありがとう、ヴィンス
追加情報: 1 行あたりの処理時間は異なります。高速で I/O バウンドがほとんどない問題もあれば、CPU バウンドの問題もあります。CPU バウンドで非依存のタスクは、並列化からポストを獲得するため、データを処理関数に割り当てる非効率的な方法であっても、ウォール クロック時間に関しては依然として有益です。
典型的な例は、行からフィールドを抽出し、さまざまなビット単位のフラグをチェックし、特定のフラグを持つ行をまったく新しい形式で新しいファイルに書き込むスクリプトです。これは I/O バウンドの問題のように思えますが、パイプを使用した安価な並行バージョンで実行したところ、約 20% 高速でした。プールとマップ、またはキューで実行すると、multiprocessing
常に100%以上遅くなります。