我有一個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