【发布时间】:2019-06-30 14:39:32
【问题描述】:
在 for 循环中启动多处理应用程序时,Python 会耗尽内存。每增加一个循环,分配的内存就会变大。我该如何解决这个问题?
我正在执行大型蒙特卡罗模拟,每个模拟都有数千个。为了提高性能,我使用multiprocessing 模块并在 10 个内核上并行运行各个模拟。每个蒙特卡罗模拟都使用相同的模型,但模型输入不同。我基本上是在一个输入列表上循环,并在之前的蒙特卡罗模拟完成后使用下一个模型输入开始一个新的蒙特卡罗模拟。
奇怪的是,之前蒙特卡罗模拟分配的内存在完成后并没有释放。分配的内存随着每次额外的蒙特卡罗模拟而变得更大,直到 python 内存不足。上一次蒙特卡洛模拟中的每个 python 对象都被下一次蒙特卡洛模拟中的对象覆盖。在循环结束时使用del 或调用gc.collect() 删除对象没有帮助。
我目前的解决方案:在 bash 脚本中实现 for 循环,它在每个循环中调用 python。
代码很大,由几个不同的类组成。基本上是这样的:
from monte_carlo import mc_class
input_list = [input1, input2, ...]
model_parameters = ...
for inpt in input_list:
mc = mc_class(model_parameters=model_parameters, model_inputs=inpt)
mc.run()
mc.save_results()
mc.generate_plots()
del mc
mc.run() 启动蒙特卡罗模拟。此调用创建多个进程,运行它们并收集结果。代码与https://github.com/lbl-srg/EstimationPy/blob/master/estimationpy/fmu_utils/fmu_pool.py基本一致
我希望在multiprocessing 完成后释放内存。我以为python会垃圾收集,尤其是在del mc之后。
【问题讨论】:
标签: python memory multiprocessing out-of-memory python-multiprocessing