2

multiprocessing.Pool.map()在每个输入值很大(例如 500 MB)但输入值通常包含相同的大对象的情况下并行计算许多结果是否有效?恐怕工作方式multiprocessing是将每个输入值的腌制版本发送到池中的每个工作进程。如果不执行优化,这将意味着为每个输入值发送大量数据map()。是这样吗?我很快看了一下multiprocessing代码,但没有发现任何明显的东西。

更一般地说,你会推荐什么简单的并行化策略来做一个map()说 10,000 个值,每个值都是一个元组(vector, very_large_matrix),其中向量总是不同的,但是只有 5 个不同的非常大的矩阵?

PS:大输入矩阵实际上是“渐进式”出现的:首先发送 2,000 个向量与第一个矩阵一起发送然后发送 2,000 个向量与第二个矩阵一起发送,依此类推。

4

2 回答 2

1

我认为显而易见的解决方案是发送对very_large_matrix 的引用而不是对象本身的克隆?如果只有五个大矩阵,则在主进程中创建它们。然后当它multiprocessing.Pool被实例化时,它将创建许多克隆父进程地址空间的子进程。这意味着如果池中有六个进程,那么内存中将同时存在 (1 + 6) * 5 个不同的矩阵。

因此,在主过程中创建所有唯一矩阵的查找:

matrix_lookup = {1 : matrix(...), 2 : matrix(...), ...}

然后将每个矩阵的索引matrix_lookup与向量一起传递给工作进程:

p = Pool(6)
pool.map(func, [(vector, 1), (vector, 2), (vector, 1), ...])
于 2012-04-20T11:41:26.753 回答
1

我遇到了一个类似的问题:在大数据集上并行计算。正如你提到multiprocessing.Pool.map的腌制论点。我所做的是实现我自己的fork()包装器,它只将返回值腌制回父进程,从而避免腌制参数。map()和包装顶部的平行线。

于 2012-04-20T14:19:48.683 回答