我有一个Class,它在状态中存储一个大型的数组numpy
。这导致multiprocessing.Pool
变得非常缓慢。这里有一个MRE:状态为大型数组的多处理
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)
我已经有了CPU 4个内核,这意味着该代码应该(和不)运行约2秒钟。 (tqdm
显示2秒为进度条,这个例子没有必要)。但是,在主程序中,如果我做mat = numpy.random.random((10000,10000))
,则需要永久运行。我怀疑这是因为Pool
正在为每个工作人员复制mat
,但我不确定这是如何工作的,因为mat
处于Class的状态,并且不直接参与imap
调用。所以,我的问题是:
- 为什么会发生这种情况? (即,
Pool
如何在一个类中工作?它到底具体是什么?制作了哪些副本以及通过引用传递了什么?) - 什么是可行的解决方法?
编辑:修改foo
做出的mat
使用,这更代表我真正的问题。
你的主程序中有多大'x'? –
在你的主程序中,你传递给'p.imap'的函数是否需要'MP'的方法,或者它可以是一个未绑定的函数? –
@JeremyMcGibbon好点。我想我的例子并不能很好地表达我的真正问题。所以,函数确实需要是'MP'的方法,因为函数实际上是从'mat'中读取的。 – ved