Java HSQLDB - 批量批量插入:OutOfMemoryError:GC开销限制超出

时间:2017-03-01 19:28:14

标签: java sql garbage-collection batch-processing hsqldb

我在ArrayList中有5700万个字符串,我想将其插入到HSQLDB中。但是我总是耗尽内存并在此过程中得到“java.lang.OutOfMemoryError:Java堆空间”“OutOfMemoryError:GC开销限制超出”错误。 / p>

我尝试了任何建议的解决方案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-Statement有关,因为更改for循环条件不会改变它。

我试过

  • 越来越小的批量大小
  • 在每个executeBatch()
  • 之后覆盖语句
  • 语句在每个executeBatch()
  • 之后关闭
  • 在每个executeBatch()
  • 之后提交

1 个答案:

答案 0 :(得分:1)

看起来你正在使用内存表,并且在插入大量行时内存耗尽。

尝试使用基于文件的数据库创建CACHED TABLE。然后,您可以尝试不同的批量大小。

您还必须在每批后提交。所有插入的行都保存在内存中,直到您提交为止。