2

最新バージョンのcplexをインストールし、JAVAAPIを介して使用します。cplexインスタンスを構築するオーバーヘッドを回避するために、cplex.clearmodelを使用してから、新しいモデルを作成します。

しかし、線形計画法を何千回も実行するためにそれを使用すると、メモリリークの問題は非常に深刻です。2GB以上のRAMを消費しました。メモリリークの問題を軽減するための解決策はありますか?

4

4 に答える 4

4

線形計画法を実行するときに、以前にこの問題が発生しました。正確に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.
于 2012-11-17T12:50:31.650 に答える
0

Java を分析するソフトウェアが存在します。

Jプロファイラー

http://www.ej-technologies.com/products/jprofiler/overview.html

あなたのキット

http://www.yourkit.com/

VisualVM

http://visualvm.java.net/index.html

于 2012-11-17T12:41:04.870 に答える