首页 > 解决方案 > for循环中的Python多处理;循环之间未清除内存

问题描述

在 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.

标签: pythonmemorymultiprocessingout-of-memorypython-multiprocessing

解决方案


垃圾收集器的工作独立于代码。删除对象时del,它不会调用垃圾收集器。

import gc可以获得垃圾收集器的相当广泛的 API,包括显式运行垃圾收集器(例如,在您del mc的 .

请参阅:https ://docs.python.org/3/library/gc.html


推荐阅读