所以经过长时间的考虑和尝试,我再次向专业人士请教。 我的场景如下:我想将两个数据集(np 数组,约 2000^3)与某个函数进行比较。必须对大约 1000 个随机点进行此比较,每个点有 300 个不同的设置。第二个数据集保存了该测量的破坏条件的值,因此每个工作人员都必须知道整个数据集和掩码。
我的想法,因为我有 64 个 CPU 和 200+GB RAM 看起来像这样
def compare(point,setting,data,mask):
if mask[point]==somevalue:
for i in setting:
do.something(data)
def parallel():
pool = mp.Pool(processes=4)
for i in range(points):
pool.apply_async(compare, args = (point,setting,data,mask), callback = some_call)
pool.close()
pool.join()
if __name__ == '__main__':
parallel()
这似乎适用于小型数据集,但不适用于所需范围内的数据集。 worker 似乎被应用到池中并且池被关闭,但随后什么也没有发生。我认为,应该有一种方法,以某种方式存储数据和掩码数组,以便每个工作人员都可以访问它们,而无需将它们显式传递给每个工作人员(也许是内存映射?)。或者问题是别的什么?
我希望能够很好地解释这个问题,如果没有,我会尽力澄清。
最佳答案
尝试仅使用全局变量来存储常用数组,并允许继承父进程数据的 fork /子进程行为为您完成工作(尽管请注意,如果您的数组真的很大,这可能不起作用)。这可能会解决通过 Process 构造函数腌制大量数据的问题。
关于python - 在多处理中处理大量数据和进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18133185/