python - 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
.
解决方案
垃圾收集器的工作独立于代码。删除对象时del
,它不会调用垃圾收集器。
您import gc
可以获得垃圾收集器的相当广泛的 API,包括显式运行垃圾收集器(例如,在您del mc
的 .
推荐阅读
- ssl - 无法将 Heroku 连接到自定义 Google 域
- database - 如何在 Cypher Neo4j 中获取不包含(相关)具有特定属性的节点的所有节点
- c++ - 是否有符合标准的方法来确定非静态成员的对齐方式?
- java - 海量数据的最佳排序算法
- java - 如何从 sikuli 中的 FindFailed 异常继续,而不是重新执行整个脚本
- go - 在golang中两个不同的tcp客户端之间中继数据
- vb.net - 我的登录页面有问题。使用 sqlite 数据库
- c# - 当项目被添加到它的 ItemsSource 时,我如何显示被逐一添加到 ListView 的项目?
- aspectj - 带有 jar 类加载器的 AspectJ
- javascript - 如何将构造的对象从 javascript 导入打字稿