带有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版本中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...