python - 减少 pyomo 模型的内存需求

标签 python memory pyomo reducing

我正在构建一个大型 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上):

  1. 内存使用量为 13.2 MB

添加所有 SetParam 对象后:

  • 内存使用量为 13.3 MB
  • 添加所有 Var 对象后:

  • 内存使用量为 14.3 MB
  • 添加所有Constraint对象后:

  • 内存使用量为 15.0 MB
  • 当我将时间步设置为 60 时,结果是

    1. 内存使用量为 13.2 MB(数据)
    2. 内存使用量为 13.3 MB(设置、参数之后)
    3. 内存使用量为 19.6 MB(变量之后)
    4. 内存使用量为 23.6 MB(经过限制)

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

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

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

    更新 2:如果模型中未使用 e_pro_ine_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/

    相关文章:

    python - 如何按空格和行尾字符拆分文件内容?

    python - python 中正确的线程

    python - 实现与 TCP 服务器交互的基于 Web 的客户端

    python - Pyomo:从 Python 代码访问解决方案

    Python 计算器/定义

    linux - 如何在linux上使用 "pmap"查找我编写的程序的内存使用情况

    c++ - 是否需要显式对齐?

    iOS [ARC] 应用程序不释放内存

    python - Pyomo 中 MINLP 求解器 "apopt"的实现

    python - 您如何让 CBC 在时限内返回最佳解决方案? (皮莫)