最新バージョンのcplexをインストールし、JAVAAPIを介して使用します。cplexインスタンスを構築するオーバーヘッドを回避するために、cplex.clearmodelを使用してから、新しいモデルを作成します。
しかし、線形計画法を何千回も実行するためにそれを使用すると、メモリリークの問題は非常に深刻です。2GB以上のRAMを消費しました。メモリリークの問題を軽減するための解決策はありますか?
最新バージョンのcplexをインストールし、JAVAAPIを介して使用します。cplexインスタンスを構築するオーバーヘッドを回避するために、cplex.clearmodelを使用してから、新しいモデルを作成します。
しかし、線形計画法を何千回も実行するためにそれを使用すると、メモリリークの問題は非常に深刻です。2GB以上のRAMを消費しました。メモリリークの問題を軽減するための解決策はありますか?
線形計画法を実行するときに、以前にこの問題が発生しました。正確に1つのオブジェクトを作成し、そのオブジェクトへの参照を1つだけ使用し続ける必要があります。
import ilog.concert.*;
import ilog.cplex.*;
static public class Application {
static public main(String[] args) {
try {
IloCplex cplex = new IloCplex();
// create model and solve it
} catch (IloException e) {
System.err.println("Concert exception caught: " + e);
}
}
}
この問題は
IloCplex cplex = new IloCplex();
プログラムで上記の行を1回だけ呼び出します。clearModelメソッドが機能しない場合は、すべての制約をクリアし、目的関数をクリアし、カットを個別にクリアしてから、制約と目的関数をリセットしますが、新しいオブジェクトは作成しないでください。それがメモリリークの原因です。新しいモデルを解決するには、
cplex.solve()
あなたのコードはこんな感じだと思います
import ilog.concert.*;
import ilog.cplex.*;
public class Example {
public static void main(String[] args) {
try {
for(int i = 1;i <= 5;i++){ // Loop with indices that you may use to create your constraints and objective function.
IloCplex cplex = new IloCplex(); // Cause of memory leak
double[] lb = {0.0, 0.0, 0.0};
double[] ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE};
IloNumVar[] x = cplex.numVarArray(3, lb, ub);
double[] objvals = {1.0, 2.0, 3.0};
cplex.addMaximize(cplex.scalProd(x, objvals));
cplex.addLe(cplex.sum(cplex.prod(-1.0, x[0]),
cplex.prod( 1.0, x[1]),
cplex.prod( 1.0, x[2])), 20.0);
cplex.addLe(cplex.sum(cplex.prod( 1.0, x[0]),
cplex.prod(-3.0, x[1]),
cplex.prod( 1.0, x[2])), 30.0);
if ( cplex.solve() ) {
cplex.out().println("Solution status = " + cplex.getStatus());
cplex.out().println("Solution value = " + cplex.getObjValue());
double[] val = cplex.getValues(x);
int ncols = cplex.getNcols();
for (int j = 0; j < ncols; ++j)
cplex.out().println("Column: " + j + " Value = " + val[j]);
}
cplex.end();
}
}
catch (IloException e) {
System.err.println("Concert exception '" + e + "' caught");
}
}
}
IloCplexオブジェクトのインスタンスを作成した後、forループまたはwhileループを開始します。したがって、上記のコードとは対照的に、
IloCplex cplex = new IloCplex(); // Cause of memory leak
for(int i = 1;i <= 5;i++){ // Loop with indices that you may use to create your constraints and objective function.
Java を分析するソフトウェアが存在します。
Jプロファイラー
http://www.ej-technologies.com/products/jprofiler/overview.html
あなたのキット
VisualVM