2017-03-01 18 views
0

私は、HSQLDBに挿入するArrayListに5700万の文字列を持っています。しかし、私はいつもメモリがなくなり、処理中に"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(); 

私は、forループの条件を変更すると、それを変更しないので問題は、Javaの文が接続されているかなり確信しています。

は、私はすべてのexecuteBatch() 後、すべてのexecuteBatch()

  • コミット後に近く、すべてのexecuteBatch()
  • 文の後の文を上書き

    • 小さく、より大きなバッチサイズ
    • を試してみました
  • 答えて

    1

    メモリ内のテーブルを使用していて、たくさんのoを挿入するとメモリが不足しているようですf行。

    ファイルベースのデータベースでCREATE CACHED TABLEを実行してみてください。次に、異なるバッチサイズを試すことができます。

    また、各バッチ後にコミットする必要があります。挿入されたすべての行は、コミットするまでメモリに保持されます。

    関連する問題