Ubuntu 内核由于内存不足终止了 CPLEX ILP 进程

Ubuntu kernel kills CPLEX ILP process due to out of memory

我正在 Java 中使用 ILOG CPLEX 库来解决 ILP 问题。我使用的是默认设置,没有调整任何参数。我使用了我在主循环示例中在线找到的示例代码:

if (cplex.solve()) {
    Log.printLine("CPLEX solved successfully");
} else {
    Log.printLine("probably insufficient memory or some other weird problem.");
}

我在具有 24GB RAM 的 Ubuntu 14 系统上启动了我的 jar,让它解决了更大的问题。当我的问题变得太大而无法使用 24GB RAM 解决时,我希望 CPLEX 从 solve 方法中得到 return false。相反,我的 CPLEX 会无休止地保持 运行,直到我的内核终止进程。我通过检查 kern.log:

验证了这一点
Nov  6 00:21:47 node0 kernel: [3779722.641458] Out of memory: Kill process 3600 (java) score 980 or sacrifice child
Nov  6 00:21:47 node0 kernel: [3779722.641476] Killed process 3600 (java) total-vm:36562768kB, anon-rss:23969732kB, file-rss:688kB

这是我第一次使用 CPLEX,我想知道如何才能让 CPLEX 在内存不足时 return false 解决方法(而不是让系统资源)?

我尝试在线查找并找到一些关于 WorkMem 和 TreeLimit 参数的 C++ 线程,但我无法找到如何使用 Java 库配置它们。

有人能帮我进一步吗?谢谢

编辑:这是 CPLEX 日志

Found incumbent of value 5000.000000 after 0.09 sec. (48.51 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 600000 rows and 1 columns.
MIP Presolve modified 156010 coefficients.
Reduced MIP has 171010 rows, 770000 columns, and 3170000 nonzeros.
Reduced MIP has 770000 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 5.54 sec. (2155.22 ticks)
Probing time = 5.51 sec. (186.83 ticks)
Tried aggregator 1 time.
Reduced MIP has 171010 rows, 770000 columns, and 3170000 nonzeros.
Reduced MIP has 770000 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 3.68 sec. (1438.46 ticks)
Probing time = 3.45 sec. (181.50 ticks)
Clique table members: 263821.
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 4 threads.
Root relaxation solution time = 43.34 sec. (14019.88 ticks)

Nodes                                         Cuts/
Node  Left     Objective  IInf  Best Integer    Best Bound    ItCnt     Gap

0+    0                         5000.0000        0.0000           100.00%
0     0     4547.0452 14891     5000.0000     4547.0452       20    9.06%
0     0     4568.6089 12066     5000.0000    Cuts: 6990   318432    8.63%

它一直持续到内核杀死它。

要更改 WorkMem 参数,您需要这样做:

IloCplex cplex = new IloCplex();
cplex.setParam(IloCplex.Param.WorkMem, 2048);

请参阅 TreeLimit and MIP.Strategy.File 的文档。在调查这个问题时,我在 TreeLimit 文档中发现了一个小问题。它在那里提到了 128MB(WorkMem 的旧默认值),但它应该是 2048MB。正在修复。

您可以在 CPLEX 附带的示例中找到许多关于如何更改参数的示例(例如 MIPex3.java 等,这些示例可以在示例子目录中找到)。

有关详细信息,请参阅 running out of memory

此处的所有链接均适用于 CPLEX 12.6.2,但如果您安装了其他软件,您应该能够 select 知识中心中不同版本的文档。