如何使用 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
无关。清除数字就解决了。
这是我如何利用 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
无关。清除数字就解决了。