2012-11-17 66 views
2

我安裝了最新版本的cplex,並通過它的JAVA API使用它。 爲了避免構建cplex實例的開銷,我使用cplex.clearmodel,然後創建新模型。在JAVA中使用cplex時如何避免內存泄漏?

但是當我用它做數千次線性編程時,內存泄漏問題非常嚴重。它消耗了超過2GB的RAM。 是否存在緩解內存泄漏問題的解決方案?

回答

3

我以前在運行我的線性程序時遇到過這個問題。您必須創建一個對象並繼續僅使用該對象的一個​​引用。

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(); 

只有撥打以上線路一旦在你的程序。如果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對象的實例後,循環啓動。因此,相對於上面的代碼,做

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. 
+1

我只創建一個對象。就像你說的,我第一次創建對象,然後使用cplex.clearmodel來清除以前的模型。我知道多次創建對象時會有更多的內存泄漏,但是當我創建一次模型並使用清晰的模型創建新模型時,仍然存在一些內存泄漏。 –

+0

+1你剛剛救了我的男人我不知道多少個小時。謝謝。我的記憶變得瘋狂,現在它不超過340 MB。 –

0

基於我對CPLEX 12.7評價,你可以調用cplex.end()後的System.gc(),這可以節省大量的內存。