2

multiprocessing.Pool.map()各入力値が大きい(たとえば500 MB)状況で、多くの結果を並行して計算するのは効率的ですか?ただし、入力値には一般に同じ大きなオブジェクトが含まれていますか?私はmultiprocessing、各入力値のピクルスバージョンをプール内の各ワーカープロセスに送信することで機能するのではないかと心配しています。最適化が実行されない場合、これは、の入力値ごとに大量のデータを送信することを意味しmap()ます。これは本当ですか?私はすぐにmultiprocessingコードを調べましたが、明らかなものは何も見つかりませんでした。

より一般的には、たとえば10,000個の値を実行するために、どの単純な並列化戦略をお勧めしますかmap()。各値はタプル(vector, very_large_matrix)であり、ベクトルは常に異なりますが、5つの異なる非常に大きな行列しかない場合はどうでしょうか。

PS:大きな入力行列は実際には「プログレッシブ」に表示されます。最初に2,000個のベクトルが最初の行列と一緒に送信され、次に2,000個のベクトルが2番目の行列と一緒に送信されます。

4

2 に答える 2

1

明らかな解決策は、オブジェクト自体のクローンではなく、very_large_matrixへの参照を送信することだと思いますか?大きな行列が5つしかない場合は、メインプロセスで作成します。次に、multiprocessing.Poolがインスタンス化されると、親プロセスのアドレス空間を複製する多数の子プロセスが作成されます。つまり、プールに6つのプロセスがある場合、メモリには(1 + 6)*5つの異なるマトリックスが同時に存在します。

したがって、メインプロセスで、すべての一意の行列のルックアップを作成します。

matrix_lookup = {1 : matrix(...), 2 : matrix(...), ...}

次に、各行列のインデックスをmatrix_lookupベクトルとともにワーカープロセスに渡します。

p = Pool(6)
pool.map(func, [(vector, 1), (vector, 2), (vector, 1), ...])
于 2012-04-20T11:41:26.753 に答える
1

同様の問題が発生しました。大きなデータセットでの計算の並列化です。あなたが言ったようmultiprocessing.Pool.mapに、議論をピクルスにします。私がしたことはfork()、戻り値のみを親プロセスにピクルスする独自のラッパーを実装することでした。これにより、引数のピクルス化を回避しました。map()そしてラッパーの上に平行。

于 2012-04-20T14:19:48.683 に答える