python - OpenMDAO内部记录器效率低?
问题描述
我最近“被迫”使用无梯度优化器(包括 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')
花费时间:几秒钟内....
解决方案
通过此提交,我们能够使 CaseReader 对于您所描述的案例更加高效。iteration_coordinate
系统、驱动程序和求解器迭代表中的列现在已编入索引,这将显着减少通过get_case
大型数据库方法获取案例所需的时间。我们还在CaseReaderload_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
推荐阅读
- javascript - 在 Webview 上使用 Javascript 控制可见性 LinearLayout
- sql - SQL Server - 多个 WHERE 查询的矩阵
- java - 在泛型集合中实现 remove(Object o)
- typo3 - 将 youtube 视频嵌入来自 youtube-nocookie.com 的 TYPO3
- javascript - 如何构造 if...else 语句以返回 true
- javascript - Angular/Javascript - 返回正确的数字 onKeyUp
- c# - 将字符串数组添加到 JObject
- java - 如何使用 Selenium WebDriver 和 Cucumber 在 Chrome 中正确打开本地文件?
- python - 使用 Django 作为 GUI 进行长时间运行的 python 进程
- python - 生成固定长度的随机数