OpenMDAO Dymos中trajectory.simulate重复触发setup的优化方案问询
利用类级缓存实现大气数据单次加载
针对OpenMDAO轨迹仿真中每个段对应独立Problem实例、大气数据重复加载的问题,可通过类属性缓存实现相同选项下数据仅加载一次,同时保留季节等选项对数据的影响,具体实现如下:
核心思路
用类级字典作为缓存容器,以选项组合的唯一标识为键存储已加载的大气数据。当不同Problem实例的组件使用相同选项时,直接复用缓存数据;选项不同时则加载对应数据并存入缓存。
完整代码实现
import openmdao.api as om class AtmosphereCalculator(om.ExplicitComponent): # 类级缓存:键为选项组合的可哈希标识,值为加载完成的大气数据 _data_cache = {} def initialize(self): # 声明影响数据加载的配置选项 self.options.declare('season', default='summer', values=['summer', 'winter', 'spring', 'autumn']) self.options.declare('base_year', default=2020, types=int) def setup(self): # 生成选项的唯一键:将选项转为可哈希的元组,确保相同选项组合得到相同键 option_key = (self.options['season'], self.options['base_year']) # 检查缓存,不存在则执行数据加载 if option_key not in self._data_cache: # 替换为第三方库的实际加载逻辑,示例如下: # import atmospheric_lib # self._data_cache[option_key] = atmospheric_lib.load_dataset( # season=self.options['season'], # year=self.options['base_year'] # ) print(f"Loading atmospheric data for {option_key}...") # 测试用打印,实际删除 # 将缓存数据绑定到实例属性,方便compute方法调用 self.atm_data = self._data_cache[option_key] # 定义输入输出接口 self.add_input('altitude', units='m', desc='Flight altitude') self.add_output('density', units='kg/m**3', desc='Atmospheric density') self.add_output('temperature', units='K', desc='Atmospheric temperature') def compute(self, inputs, outputs): # 复用缓存数据完成计算,替换为实际业务逻辑 altitude = inputs['altitude'] outputs['density'] = self.atm_data.get_density(altitude) outputs['temperature'] = self.atm_data.get_temperature(altitude)
注意事项
- 选项可哈希性:如果选项包含字典等不可哈希类型,需先转换为排序元组或JSON字符串作为缓存键
- 缓存管理:如需更新数据或清空缓存,可直接操作类属性
AtmosphereCalculator._data_cache.clear() - 线程安全:多线程仿真场景下需添加锁机制(如
threading.Lock)保护缓存读写,单线程环境无需额外处理
内容的提问来源于stack exchange,提问作者Jehan Dastoor
相关产品推荐
相关产品推荐

