多处理中的共享内存对象假设我有一个大内存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如果我们不复制数组,为什么会有这么大的开销?共享内存拯救了我的哪一部分?
添加回答
举报
0/150
提交
取消