我发现很多类似的问题,但没有答案。对于简单数组,有多处理.Array。对于稀疏矩阵或任何其他任意对象,我找到manager.namespace。所以我尝试了下面的代码:
from scipy import sparse
from multiprocessing import Pool
import multiprocessing
import functools
def myfunc(x,ns):
return ns.A[x,:]*ns.A*ns.A[:,x]
manager = multiprocessing.Manager()
Global = manager.Namespace()
pool=Pool()
Global.A=sparse.rand(10000,10000,0.5,'csr')
myfunc2=functools.partial(myfunc,ns=Global)
r=pool.map(myfunc2, range(100))
代码有效,但效率不高。 16名工人中只有4名工作。原因是,我猜,经理只允许一个工人一次访问数据。由于数据是只读的,我真的不需要锁。那么有更有效的方法吗?
p.s。,我看到有人在谈论copy-on-write fork()。我真的不明白它是什么,但它不起作用。如果我先生成A并执行Pool(),则每个进程都有一个A的副本。
提前谢谢你。
答案 0 :(得分:0)
Namespace对象的属性仅在explicitly assigned to时更新。给出了很好的解释here。
编辑:查看实现(在multiprocessing/managers.py
中),它似乎没有使用共享内存。它只是腌制物品并在要求时将它们发送给孩子。这可能就是为什么花了这么长时间。
您是否有机会创建一个拥有更多工作人员的池而不是CPU拥有内核? (即使用processes
构造函数的Pool
参数。)这通常不是一个好主意。
您还可以尝试其他一些事项;