をPython3
に利用しようとすると、大きな行列を並行して処理しようとしています。コードの一般的な構造は以下の通りである:なぜconcurrent.futures.ProcessPoolExecutorのパフォーマンスが非常に低いですか?
class X(object):
self.matrix
def f(self, i, row_i):
<cpu-bound process>
def fetch_multiple(self, ids):
with ProcessPoolExecutor() as executor:
futures = [executor.submit(self.f, i, self.matrix.getrow(i)) for i in ids]
return [f.result() for f in as_completed(futures)]
self.matrix
が大きいscipy csr_matrixあります。 f
は、self.matrix
の行を受け取り、CPUバインドプロセスを適用する私の並行機能です。最後に、fetch_multiple
は、f
の複数のインスタンスを並行して実行し、結果を返す関数です。
問題は、(次のスクリーンショットを参照してください)スクリプトを実行した後、すべてのCPUコアが50%未満忙しいということである。
すべてのコアがビジー状態でないのはなぜ?
私は問題がself.matrix
の大きなオブジェクトであり、プロセス間で行ベクトルを渡していると思います。どうすればこの問題を解決できますか?