私は大きなnumpy
アレイを状態に格納しているクラスを持っています。これにより、multiprocessing.Pool
が極端に遅くなります。このコードは(とない)で約2秒で実行する必要があることを意味し、私はCPUに4つのコアを持っている状態で大きな配列を持つマルチプロセッシング
from multiprocessing import Pool
import numpy
import time
from tqdm import tqdm
class MP(object):
def __init__(self, mat):
self.mat = mat
def foo(self, x):
time.sleep(1)
return x*x + self.mat.shape[0]
def bar(self, arr):
results = []
with Pool() as p:
for x in tqdm(p.imap(self.foo, arr)):
results.append(x)
return results
if __name__ == '__main__':
x = numpy.arange(8)
mat = numpy.random.random((1,1))
h = MP(mat)
res = h.bar(x)
print(res)
:ここではMREのです。 (tqdm
は進行状況バーとして2秒を示していますが、この例では実際には必要ありません)。しかし、メインプログラムでは、私がmat = numpy.random.random((10000,10000))
を実行すると、それは永遠に実行されます。私はこれがPool
がそれぞれの労働者のためにmat
のコピーを作っているからだと思うが、mat
がクラスの状態にあり、コールに直接関与していないので、この仕組みがわからない。だから、私の質問は次のとおりです。
- この現象はなぜ起こりますか? (つまり、クラス内で
Pool
がどのように動作するのですか?何が正確に行われるのですか?どのようなコピーが作成され、何が参照によって渡されますか)。 - この問題にはどのような回避策がありますか?
編集:私の本当の問題のより代表的である、mat
を利用するためにfoo
を修正。
あなたのメインプログラムの 'x'の大きさは? –
あなたのメインプログラムでは、 'p.imap'に渡す関数は' MP'のメソッドである必要がありますか、それともアンバウンド関数なのでしょうか? –
@JeremyMcGibbon良い点。私の例は私の本当の問題の良い表現ではなかったと思う。関数は実際に 'mat'から読み込むので、関数は' MP'のメソッドである必要があります。 – ved