繁体   English   中英

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

[英]Java HSQLDB - Bulk Batch Insert: OutOfMemoryError: GC overhead limit exceeded

我在ArrayList中有5700万个字符串,我想将其插入到HSQLDB中。 但是我总是在内存不足的情况下,在此过程中收到“ java.lang.OutOfMemoryError:Java堆空间”“ OutOfMemoryError:超出了GC开销限制”错误。

我尝试了这里建议的任何解决方案。

        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循环条件不会更改它。

我试过了

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

看起来您正在使用内存表,并且当您插入很多行时内存用完了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM