2015-10-12 38 views
0

我有一個存儲各種緯度和經度值以及其他屬性的散列表。我想根據名爲interval的用戶輸入變量將其打印出來。間隔越大,hashmap越大。我的問題是,目前我能夠達到的最大間隔時間是300,以生成完整的csv文件。當我輸入400,Excel文件不能被完全加載,並且更重要的是,我需要的時間間隔在500設置當我將它設置爲500,這是錯誤我得到的,來自大量填充的HashMap的CSV輸出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Unknown Source) 
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source) 
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source) 
at java.lang.AbstractStringBuilder.append(Unknown Source) 
at java.lang.StringBuilder.append(Unknown Source) 

我看着它顯然這是因爲輸出首先被複制到一個不能支持這麼多數據的數組中。有沒有辦法我可以分解我的HashMap,然後結合然後將它們打印成csv?

FileWriter writer= null; 
     String output = ""; 
     try { 
      writer = new FileWriter("output.csv"); 
      writer.write("Name,Latitude,Longitude,Distance"); 
      StringBuilder builder = new StringBuilder(); 
      for (Entry<String, LocationPoint> entry : locationHash.entrySet()) { 
       String key = entry.getKey(); 
       Location lp = entry.getValue(); 

       double lat = lp.getLatitude(); 
       double lng = lp.getLongtitude(); 
       double dist = lp.getDistance(); 
       String name= ""; 

       String pName = lp.getPointName(); 
       if (pName.contains("nearStation") || pName.contains("nearLine")) { 
        name = pName.split("_")[1]; 
       } else 
        name = pName.split("_")[0]; 
       // 
       builder.append(name); 
       builder.append(","); 
       builder.append(String.valueOf(lat)); 
       builder.append(","); 
       builder.append(String.valueOf(lng)); 
       builder.append(","); 
       builder.append(String.valueOf(dist)); 
       builder.append(System.getProperty("line.separator")); 

      } 
      output = builder.toString(); 
      mrtWriter.write(output); 
      System.out.println("Output Complete"); 

     } finally { 
      if (mrtWriter != null) { 
       mrtWriter.close(); 
      } 
     } 

** LocationHash存儲密鑰的字符串和該值的Location對象。

回答

3

由於您的StringBuilder正在增長大於整數的最大長度(Integer.MAX_VALUE),因此您會收到此問題。這是數組的最大數目,並試圖將其擴展超過此限制引發了您剛剛獲得的異常。

要解決這個問題,您可以直接寫入mrtWriter對象。出於性能考慮,把它包裝成一個的BufferedWriter:

Writer mrtWriter = new BufferedWriter(new FileWriter(new File("path/to/file"))); 

如果你想保留的StringBuilder出於某種原因,然後在您的StringBuilder追加了幾行,然後調用mrtWriter.write(builder.toString()),其次是output.setLength(0)重置的StringBuilder。

+0

或者,如果您使用它進行緩衝,請使用BufferedWriter – RobAu

+0

謝謝!我決定我的stringbuilder沒有用處。你達人歡呼 – user3763216