Ядро Ubuntu убивает процесс CPLEX ILP из-за нехватки памяти
Я работаю с библиотекой ILOG CPLEX в Java, чтобы решить проблему ILP. Я использую настройки по умолчанию и не настраивал никаких параметров. Я использовал пример кода, который я нашел онлайн в примерах для моего основного цикла:
if (cplex.solve()) {
Log.printLine("CPLEX solved successfully");
} else {
Log.printLine("probably insufficient memory or some other weird problem.");
}
Я запустил свой jar в системе Ubuntu 14 с 24 ГБ ОЗУ и позволил решить большие проблемы. Когда моя проблема становится слишком большой, чтобы решить ее с 24 ГБ ОЗУ, я ожидаю, что CPLEX вернет 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 для метода решения, когда ему не хватило памяти для работы (вместо того, чтобы истощать системные ресурсы)?
Я попытался найти это в Интернете и нашел несколько тем C++ о параметрах WorkMem и TreeLimit, но я не могу найти, как я могу настроить их с помощью библиотеки 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 ответ
Чтобы изменить параметр WorkMem, вы должны сделать что-то вроде этого:
IloCplex cplex = new IloCplex();
cplex.setParam(IloCplex.Param.WorkMem, 2048);
Смотрите документацию для TreeLimit и MIP.Strategy.File. Рассматривая это, я обнаружил небольшую проблему в документации TreeLimit. Там упоминается 128 МБ (старое значение по умолчанию WorkMem), но вместо этого должно быть 2048 МБ. Это исправлено.
Вы можете найти много примеров того, как изменить параметры в примерах, поставляемых с CPLEX (например, MIPex3.java и т. Д., Которые можно найти в подкаталоге примеров).
Для получения дополнительной информации смотрите исчерпание памяти.
Все ссылки здесь для CPLEX 12.6.2, но вы должны быть в состоянии выбрать документацию для различных версий в центре знаний, если у вас установлено что-то еще.