2017-03-01 119 views
0

我在一個ArrayList中有57,000,000個字符串,我想要插入到HSQLDB中。但我總是用盡內存並得到一個「java.lang.OutOfMemoryError:Java堆空間」「OutOfMemoryError:超出GC開銷限制」錯誤在過程中。Java HSQLDB - 批量批量插入:OutOfMemoryError:超出GC開銷限制

我試過任何解決方案,建議here

 DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
     String now = df.format(new Date()); 
     long iteration = 0; 
     int i, size, totalSize; 
     size = totalSize = values.size(); 
     PreparedStatement statement = connection.prepareStatement("INSERT INTO primes (P_VALUE, DATE_FOUND) VALUES (?, ?);"); 
     while (size > 0) { 
      for (i = 0; i < 1000000 && i < size; i++) { 
       iteration++; 
       statement.setString(1, values.get(i)); 
       statement.setString(2, now); 
       statement.addBatch(); 
      } 
      values = values.subList(i, size); 
      size = values.size(); 
      statement.executeBatch(); 
     } 
     statement.closeOnCompletion(); 

我很確定問題是與Java語句連接,因爲更改for-loop條件並不會改變它。

我試圖

  • 更小和更大的批量
  • 每則ExecuteBatch()
後每則ExecuteBatch()
  • 聲明每則ExecuteBatch()
  • commiting後收盤後覆蓋聲明
  • 回答

    1

    看起來您正在使用內存表,並且當您插入很多內存時內存耗盡f行。

    嘗試使用基於文件的數據庫創建CACHED TABLE。然後你可以嘗試不同的批量大小。

    您還必須在每批後提交。所有插入的行都保存在內存中直到您提交。

    相關問題