我正在构建一个大型 pyomo 模型,具有超过 100 万个约束和 200 万个变量。
我正在寻找减少我正在构建的模型的内存需求的建议。
目前它需要超过 20gb
的 RAM。
我该如何减少这个?
我从未测试过使用/不使用 within=pyomo.NonNegativeReals
来定义变量。但我假设它会减少给定变量所需的内存量。在不减少变量或约束数量的情况下,我还可以做其他事情吗?
例如:
以下 var
将需要 X
字节内存
m.var = pyomo.Var(
m.index)
也许以下将需要 X-1
字节内存
m.var = pyomo.Var(
m.index,
within=pyomo.NonNegativeReals)
当然这只是猜测。未经测试就无法确定这一点。但是,如果有人对此问题有想法或更多经验,我愿意尝试任何事情。
有什么想法吗?
一些测试:
请记住,这不是真正的模型,而是使用其他数据构建的示例。但仍然是相同的脚本。
index=1000 // Full Consts // 347580 KB (commit) // 370652 KB (working set)
0 Const Full Rules // 282416 KB (commit) // 305252 KB (working set)
0 Const 0 Rule // 282404 KB (commit) // 305200 KB (working set)
1 Const 1 Rule // 290408 KB (commit) // 313136 KB (working set)
index=8760 // Full Consts // 1675860 KB (commit) // 1695676 KB (working set)
最佳答案
我使用pympler
来分析您向我指出的测试用例。这是我发现的:
在pyomo_model_prep
之后(加载数据并将其放置到空ConcreteModel
上):
- 内存使用量为 13.2 MB
添加所有 Set
和 Param
对象后:
- 内存使用量为 13.3 MB
添加所有 Var
对象后:
- 内存使用量为 14.3 MB
添加所有Constraint
对象后:
- 内存使用量为 15.0 MB
当我将时间步设置为 60 时,结果是
- 内存使用量为 13.2 MB(数据)
- 内存使用量为 13.3 MB(设置、参数之后)
- 内存使用量为 19.6 MB(变量之后)
- 内存使用量为 23.6 MB(经过限制)
因此,当时间步数较多时,变量确实会对模型内存产生相当大的影响。我能看到的减少内存使用的唯一明显的地方是不要将所有数据存储在模型上(或者在不再需要后将其从模型中删除),那么垃圾收集器可能会清理未使用的数据.
不幸的是,实际上没有任何简单的方法可以减少变量声明的内存。
更新 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')
您需要从约束规则中提取逻辑来找出不需要的索引。
关于python - 减少 pyomo 模型的内存需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55284853/