由于内存不足,Ubuntu内核导致CPLEX ILP进程

时间:2015-11-06 12:43:04

标签: java linux ubuntu cplex

我正在使用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方法返回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在内存耗尽时(而不是使系统资源匮乏)将false返回到solve方法?

我尝试在线查找并找到一些关于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%

直到内核杀死它为止。

1 个答案:

答案 0 :(得分:0)

要更改WorkMem参数,您可以执行以下操作:

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

请参阅TreeLimitMIP.Strategy.File的文档。在研究这个问题时,我发现了TreeLimit文档中的一个小问题。它提到128MB(WorkMem的旧默认值),但它应该是2048MB。这是固定的。

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

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

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