3

完全に独立したオブジェクトの大規模なリスト(1,000 以上) があり、それぞれが高価な関数 (それぞれ約 5 分) を介して操作される必要がある場合、他のコアに作業を分散する最良の方法は何ですか? 理論的には、リストを等分に分割し、cPickle でデータをシリアル化し (数秒かかります)、チャンクごとに新しい Python プロセスを起動するだけで済みます。 -しかし、これは何よりもハックのように感じます. 確かに、マルチプロセッシング ライブラリを使用してこれを行うより統合された方法はありますか? 私はこれを考えすぎていますか?

ありがとう。

4

2 に答える 2

5

multiprocessing.Poolこれは;の良い使用例のように思えます。あなたが何をしているかに応じて、それは次のように簡単かもしれません

pool = multiprocessing.Pool(num_procs)
results = pool.map(the_function, list_of_objects)
pool.close()

これにより、リスト内の各オブジェクトが個別にピクルされます。それが問題である場合、それを回避するさまざまな方法があります (ただし、すべてに独自の問題があり、それらのいずれかが Windows で動作するかどうかはわかりません)。あなたの計算時間はかなり長いので、おそらく無関係です。

これを 5 分間 x 1000 アイテム = 数日 / コア数実行しているので、途中で部分的な結果を保存し、進行状況を出力したいと思うでしょう。最も簡単な方法は、呼び出した関数の結果をファイルやデータベースなどに保存することです。それが実用的でない場合は、apply_async をループで使用して、結果が入ったときに処理することもできます。

これを処理するためにjoblibのようなものを調べることもできます。あまり詳しくありませんが、同じ問題に近づいているようです。

于 2013-02-06T07:16:54.673 に答える
1

単一のコンピューターでジョブを実行する場合はmultiprocessing.Pool()、@Dougal の回答で提案されているように使用してください。

複数のコンピューターで問題を処理したい場合は、Python を使用することもできます。「Python並列処理」をGoogleで検索したところ、次のことがわかりました。

Python での並列処理

答えの 1 つは、単一の 377 行の Python ソース ファイルのマップ/リデュース ソリューションである "mincemeat" を推奨しています!

https://github.com/michaelfairley/mincemeatpy

複数のコンピューターで複数のコアを使用したい場合は、ちょっとした作業でmultiprocessing.Pool()、一連のひき肉クライアントを起動するために使用できるに違いありません。

編集: 今夜、さらに調査を行ったところ、セロリが適しているようです。Celery は、すでにマシンごとに複数のワーカーを実行しています。

http://www.celeryproject.org/

ここでセロリが推奨されました:

https://stackoverflow.com/questions/8232194/pros-and-cons-of-celery-vs-disco-vs-hadoop-vs-other-distributed-computing-packag

于 2013-02-06T07:48:06.123 に答える