2015-12-11 41 views
0

我寫了下面的函數計算成本矩陣,並將其存儲在CSV文件:在CSV存儲體2D矩陣:java.lang.OutOfMemoryError

private static void calculateCostMatrix() 
{ 
    int len = _POIs.size(); 
    CostMatrix = new double[len][len]; 
    for (int i=0; i<len; i++) 
    { 
     int ic = _POIs.get(i).getId(); 
     for (int j=i; j<len; j++) 
     { 
      int jc = _POIs.get(j).getId(); 
      double dist = euclideandist(_POIs.get(i).getLat(),_POIs.get(i).getLon(), 
            _POIs.get(j).getLat(),_POIs.get(j).getLon()); 
      CostMatrix[ic][jc] = dist; 
      CostMatrix[jc][ic] = dist; 
     }   
    } 

    // Save in CSV 
    try 
    { 
     String NEW_LINE = System.getProperty("line.separator"); 
     File file = new File("CostMatrix.csv"); 
     FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
     BufferedWriter bw = new BufferedWriter(fw); 
     StringBuilder sb = new StringBuilder();; 
     for (double[] row : CostMatrix) 
     { 
      for (double d : row) 
      { 
       sb.append(d); 
       sb.append(","); 
      } 
      sb.append(NEW_LINE); 
     } 
     bw.write(sb.toString()); 
     bw.close(); 
     } 

     bw.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

但是,很明顯,由於大量元素(200,000 X 200,000)我收到消息java.lang.OutOfMemoryError: Java heap space

因此,而不是預先分配的CostMAtrix一個空間,我現在想直接計算和存儲在CSV文件中的每個細胞。 我該如何以正確的方式做到這一點?

回答

0

我會做不同的。由於問題是內存,您可以在磁盤上使用臨時二進制文件而不是陣列來存儲結果。創建正確大小的臨時文件,然後通過它來存儲雙重結果(以二進制形式)。

一旦完成二進制處理整個矩陣,解析文件將其轉換爲CSV。

否則,你就必須通過價值,你的興趣點進行排序,並保持他們的指數作爲CSV行/列迴路的參考。

+0

謝謝。你能給一個例子的鏈接嗎?另外,我需要在迭代計算中使用CostMatrix。因此,這意味着在計算CostMatrix並將其存儲爲CSV後,我需要以某種方式加載此文件,以便能夠從我的動態算法中訪問CostMAtrix [i] [j]。 –

+0

作爲隨機訪問訪問CSV文件本質上非常緩慢且困難。您應該考慮將二進制文件作爲最終結果並在此工作。 https://docs.oracle.com/javase/tutorial/essential/io/rafs.html –

+0

好的。我也在評估NEO4j,但我不確定.. http://neo4j.com/developer/get-started/ –