多处理中的共享内存对象
假设我有一个大内存numpy数组,我有一个函数func
,它接受这个巨大的数组作为输入(连同一些其他参数)。func
具有不同参数可以并行运行。例如:
def func(arr, param): # do stuff to arr, param# build array arrpool = Pool(processes = 6)results = [pool.apply_async(func, [arr, param]) for param in all_params]output = [res.get() for res in results]
如果我使用多处理库,那么这个巨型数组将被多次复制到不同的进程中。
有没有办法让不同的进程共享同一个数组?此数组对象是只读的,永远不会被修改。
更复杂的是,如果arr不是一个数组,而是一个任意的python对象,有没有办法分享它?
[EDITED]
我读了答案,但我仍然有点困惑。由于fork()是copy-on-write,因此在python多处理库中生成新进程时不应调用任何额外的成本。但是下面的代码表明存在巨大的开销:
from multiprocessing import Pool, Managerimport numpy as np; import timedef f(arr): return len(arr)t = time.time()arr = np.arange(10000000)print "construct array = ", time.time() - t;pool = Pool(processes = 6)t = time.time()res = pool.apply_async(f, [arr,])res.get()print "multiprocessing overhead = ", time.time() - t;
输出(顺便说一下,随着数组大小的增加,成本也会增加,所以我怀疑仍有与内存复制相关的开销):
construct array = 0.0178790092468 multiprocessing overhead = 0.252444982529
如果我们不复制数组,为什么会有这么大的开销?共享内存拯救了我的哪一部分?
相关分类