如何使用 pathos 避免过多的 ram 消耗

How to avoid excessive ram consumption using pathos

这是我如何利用 pathos 进行多处理的粗略示例:

from pathos.multiprocessing import ProcessingPool

pool = ProcessingPool(10)
results = pool.map(func, args)

每个函数的 运行 可能需要一段时间。假设是 5 分钟,len(args) == 20。 在这种情况下,大约需要 10 分钟才能完成。 在此期间,ram 使用量稳步增长,只有在所有工作完成后才会释放内存。

主要问题:如何更改在每次一个进程完成时释放内存的方法,而不是等待所有进程完成?否则,如果有 100 个 args,总的 ram 消耗将比有 20 个 args 时大 5 倍,即使它们都是以 10 个并行块计算的。

此外,内存增长背后的原因尚不清楚。我在 func 开始分配内存,但使用量随着时间的推移而增长。 func的return值一直是0,我把结果存到磁盘上。

还有,有没有办法让几个数组驻留在共享内存区?这样每个进程都不必制作自己的副本。

built-in 进程池任务通过 maxtasksperchild argument. It's possible to use this class via pathos as described in this issue

支持这一点
import pathos

pool = pathos.pools._ProcessPool(processes=10, maxtasksperchild=1)
results = pool.map(func, args)

将 maxtasksperchild 设置为 1 应该意味着每个进程在每个任务后重新启动

我在我的 func 里面作图。为了制作这些图,我使用了 matplotlib.pyplot 的界面。事实证明,matplotlib 保留对通过 pyplot 创建的所有图形的引用。这就是 ram 没有被释放的原因。所以这个问题与pathos无关。清除数字就解决了。