如何解决带有compute_totals和有限差异的可能的内存泄漏
我想我在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版本中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。