1

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%未満忙しいということである。

enter image description here

すべてのコアがビジー状態でないのはなぜ?

私は問題がself.matrixの大きなオブジェクトであり、プロセス間で行ベクトルを渡していると思います。どうすればこの問題を解決できますか?

答えて

1

はい。 オーバーヘッドはそれほど大きくはないはずですが、CPUの使用が原因である可能性があります(しかし、とにかくデータを転送するのに忙しいはずです)。

しかし、共有メモリを使用してオブジェクトの「ポインタ」をサブプロセスに渡すために、ここでレシピを試してみてください。

http://briansimulator.org/sharing-numpy-arrays-between-processes/

そこからの引用:

from multiprocessing import sharedctypes 
size = S.size 
shape = S.shape 
S.shape = size 
S_ctypes = sharedctypes.RawArray('d', S) 
S = numpy.frombuffer(S_ctypes, dtype=numpy.float64, count=size) 
S.shape = shape 

を今、私たちはS_ctypesを送信し、 マルチプロセッシングに子プロセスに形状、および子 過程でnumpyの配列に戻って、それを変換することができます次のようになります。

from numpy import ctypeslib 
S = ctypeslib.as_array(S_ctypes) 
S.shape = shape 

参照カウントを処理するのは難しいはずですが、numpy.ctypeslibがそれを処理すると仮定します。つまり、実際の行番号をサブプロセスに渡して同じデータでは動作しないように調整してください。

関連する問題