You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化后清理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:49:53