问题描述
我想我在OpenMDAO中发现了内存泄漏,这是在重置问题并多次计算总导数时发生的。这是一种通过Sellar问题重现它的方法:
import openmdao.api as om
from openmdao.test_suite.components.sellar_feature import SellarMDA
# Setup of the Sellar poblem
prob = om.Problem()
prob.model = SellarMDA()
for i in range(10000):
# prob = om.Problem() ### adding these two lines solves the memory leak
# prob.model = SellarMDA()
prob.setup(check=False)
prob.model.cycle.linear_solver = om.DirectSolver()
prob.run_driver()
totals = prob.compute_totals("z","x")
del totals
input()
当我启动此脚本时,RAM会填满,直到关闭运行中的终端后才会释放。终止脚本不会释放内存,也不会删除totals
对象。仅当使用具有有限差异的compute_totals
时,才会发生内存泄漏。我发现重新创建问题(两条注释行)而不是仅重置它可以防止泄漏。
我当前的OpenMDAO版本是3.2.0,但是我也设法在3.3.0上重现它。
我不确定我是在做错什么还是真的是错误,但是我对有人的解释很感兴趣。避免泄漏很容易,添加两条注释行就足够了,但是由于这一点我仍然损失了几天的计算时间,我认为我可以为其他人进行记录。
解决方法
我运行了您的测试用例,并能够重现内存错误。但是,我发现即使改用完全分析的导数,问题仍然存在。肯定有一个小错误,但是内存泄漏是由重复调用prob.setup()
触发的。当我将安装程序调用移出for循环时,内存问题消失了。因此,安装过程中会有些泄漏,但是根本不需要多次调用安装程序,除非您要更改问题中的某些内容以交换可变大小或实际上需要它。
我假设在您的实际运行脚本中,您确实需要多次调用安装程序,这就是您遇到此错误的原因。我已经在GitHub的OpenMDAO问题跟踪器中记录了bug。
,我们发现了内存泄漏,并已于2020年11月24日使用commit e51b513修复。它将很快合并,并将在下一个OpenMDAO版本中。