在每个输入值很大(例如 500 MB)的情况下,使用 multiprocessing.Pool.map()
并行计算许多结果是否有效,但是输入值通常包含相同的大对象?恐怕多处理的工作方式是将每个输入值的腌制版本发送到池中的每个工作进程。如果不执行优化,这将意味着为 map()
中的每个输入值发送大量数据。是这样吗?我很快查看了multiprocessing
代码,但没有发现任何明显的东西。
更一般地说,您会推荐什么简单的并行化策略来对 10,000 个值执行 map()
,其中每个值都是一个元组 (vector,very_large_matrix)
,其中向量总是不同,但其中只有 5 个不同的非常大的矩阵?
PS:大输入矩阵实际上是“渐进”出现的:首先将 2,000 个向量与第一个矩阵一起发送,然后将 2,000 个向量与第二个矩阵一起发送,等等
最佳答案
我认为明显的解决方案是发送对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), ...])
关于python - 在 Python 中,什么时候和什么时候不使用带有 multiprocessing.Pool 的 map() ?输入值较大的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242525/