最近,我被迫使用无梯度优化器(包括pyoptsparse中的优化器)

以前,迭代次数非常少,因此记录数据从来都不是大问题,我选择了内部记录器。

但是对于超过30.000次迭代的优化问题,从案例记录器读取输入数据变得非常麻烦。

如果我要在每次迭代中使用代码简单地附加到txt文件中,则读入和绘图的速度会更快。我想问一下我是否在犯错,还是使用“附加二进制txt文件”真的更好。

步骤:

1 des var,1个约束,1个目标的优化问题〜60000次迭代sql文件大小〜30 MB

cr = CaseReader(fname)
case_keys = cr.driver_cases.list_cases()
ab=[cr.driver_cases.get_case(case_key).get_objectives()['a.obj'][0] for case_key in case_keys ]


花时间:我仍然阅读10分钟后停了下来。

f=open('out.dat','ab')
np.savetxt(f,[desvar,constraint,objec])
f.close() np.loadtxt( 'out.dat')


时间花费:几秒钟内...

最佳答案

使用this提交,我们可以使CaseReader更加高效地处理您描述的案例。现在已对系统,驱动程序和求解器迭代表中的iteration_coordinate列建立索引,这将大大减少通过get_case方法获取大型数据库案例所需的时间。我们还在CaseReader中添加了load_cases方法,该方法可以用最少的查询将所有案例加载到内存中,从而进一步提高了get_case方法的效率。

掌握最新版本的OpenMDAO并更新代码以使用load_cases应该会有所帮助。

    cr = CaseReader(fname)
    cr.load_cases()
    case_keys = cr.driver_cases.list_cases()
    ab=[cr.driver_cases.get_case(case_key).get_objectives()['a.obj'][0] for case_key in case_keys ]


您可以在以下“将数据库加载到内存中”部分中找到有关此文档的信息:http://openmdao.org/twodocs/versions/latest/features/recording/getting_values.html

关于python - OpenMDAO内部录像机效率低吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51023038/

10-12 21:26