我正在构建一个大型的pyomo模型,该模型具有超过100万个约束和200万个变量。
我正在寻找建议,以减少正在构建的模型的内存需求。
目前,它需要超过2.6.0
的RAM。
我该如何减少呢?
我从来没有测试过定义变量是否带有20gb
。但是我假设它会减少给定变量所需的内存量。还有其他我可以做的事情,而不必减少变量或约束的数量。
例如:
以下within=pyomo.NonNegativeReals
将需要var
个字节的内存
X
也许后面的内容将需要m.var = pyomo.Var(
m.index)
个字节的内存
X-1
当然这是一种推测。如果不进行测试,就无法确定这一点。但是,如果有人对这个问题有想法或更多经验,我愿意尝试任何尝试。
有什么想法吗?
一些测试:
请记住,这不是真实的模型,而是使用其他数据构建的示例。但是仍然是相同的脚本。
m.var = pyomo.Var(
m.index,
within=pyomo.NonNegativeReals)
答案 0 :(得分:0)
我已经使用pympler
分析了您指向我的测试用例。这是我发现的东西:
pyomo_model_prep
之后(加载数据并将其放到空的ConcreteModel
上):
在添加所有Set
和Param
对象之后:
添加所有Var
个对象之后:
添加所有Constraint
个对象之后:
将时间步长设置为60时,结果为
因此,当存在大量时间步长时,变量确实会对模型内存产生很大影响。我可以看到的唯一减少内存使用的地方是不将所有数据存储在模型上(或者在不再需要时将其从模型中删除),然后垃圾收集器可能会清除未使用的数据
不幸的是,实际上没有任何简单的方法可以减少变量声明的内存。
更新1:仅供参考,变量声明的所有内存使用量几乎都是由索引变量e_pro_in
和e_pro_out
造成的。
更新2:如果模型中未使用e_pro_in
和e_pro_out
变量的大量索引,则可以通过为每个变量建立减少的索引集来减少内存需求。这可能是这样的:
e_pro_in_index = []
for t in m.tm:
for i,j in m.pro_tuples:
for c in m.com:
if ...:
e_pro_in_index.append((t,i,j,c))
m.e_pro_in_index = Set(dimen=4, initialize=e_pro_in_index)
m.e_pro_in = pyomo.Var(
m.e_pro_in_index,
within=pyomo.NonNegativeReals,
doc='Power flow of commodity into process (MW) per timestep')
您需要从约束规则中提取逻辑,以找出不需要的索引。