优化后清理OpenMDAO组件以实现轻量化Pickle存储
OpenMDAO优化后组件序列化体积过大的解决方案
问题背景
在Web界面回调中运行OpenMDAO优化后,需要将大型Group组件序列化(pickle)并传递给其他回调,后续需调用依赖get_val的函数。但优化完成后,组件体积从setup后的5-20MB暴涨至500MB以上,难以进行传递。需要找到方法清理组件,使其恢复到setup后的大小,同时保留驱动设置的变量值。
解决方案
最终采用prob.load_case方案解决该问题,通过修改SqliteRecorder的journal_mode为MEMORY,将记录时间从1分钟以上降至10秒内,同时避免了频繁生成.sql-journal文件。尽管存在少量数据库损坏的风险,但完全满足业务需求。
基础示例代码
import openmdao.api as om class Comp(om.Group): def setup(self): desvars: om.IndepVarComp = self.add_subsystem('desvars', om.IndepVarComp(), promotes=['*']) desvars.add_output('x') self.add_subsystem('comp', om.ExecComp('y=x**2'), promotes=['*']) self.add_design_var('x') self.add_objective('y') if __name__ == '__main__': prob = om.Problem() comp: Comp = prob.model.add_subsystem('comp', Comp()) prob.driver = om.ScipyOptimizeDriver(optimizer='SLSQP') prob.setup() prob.run_driver() # 此处需缩减comp体积并序列化 # 反序列化后可能调用如下代码 print(comp.get_val('y'))
优化后的记录代码
recorder = om.SqliteRecorder(filepath, record_viewer_data=False) prob.add_recorder(recorder) prob.setup() prob.final_setup() with recorder.connection as c: c.execute('PRAGMA journal_mode = MEMORY')
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

