1

我正在构建一个包含超过 100 万个约束和 200 万个变量的大型 pyomo 模型。

我正在寻找减少我正在构建的模型的内存需求的建议。

目前它需要超过20gb's 的 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)
4

1 回答 1

0

我曾经pympler分析过你指给我的测试用例。这是我发现的:

之后pyomo_model_prep(加载数据并将其放在 empty 上ConcreteModel):

  1. 内存使用量为 13.2 MB

添加所有SetParam对象后:

  1. 内存使用量为 13.3 MB

添加所有Var对象后:

  1. 内存使用量为 14.3 MB

添加所有Constraint对象后:

  1. 内存使用量为 15.0 MB

当我将时间步长设置为 60 时,结果是

  1. 内存使用量为 13.2 MB(数据)
  2. 内存使用量为 13.3 MB(在设置、参数之后)
  3. 内存使用量为 19.6 MB(在 vars 之后)
  4. 内存使用量为 23.6 MB(约束后)

因此,当时间步数较多时,变量确实会对模型内存产生相当大的影响。我可以看到减少内存使用的唯一明显的地方是不要将所有数据存储在模型上(或者在不再需要后将其从模型中删除),那么垃圾收集器可能会清理未使用的数据.

不幸的是,实际上没有任何简单的方法可以减少变量声明的内存。

更新 1:仅供参考,变量声明的几乎所有内存使用都是索引变量e_pro_in的结果。e_pro_out

e_pro_in更新 2:如果模型中没有使用和变量的大量索引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')

您需要从约束规则中提取逻辑以确定不需要哪些索引。

于 2019-03-21T19:32:02.930 回答