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

Posted

技术标签:

【中文标题】Java HSQLDB - 批量插入:OutOfMemoryError:超出 GC 开销限制【英文标题】:Java HSQLDB - Bulk Batch Insert: OutOfMemoryError: GC overhead limit exceeded 【发布时间】:2017-03-01 19:28:14 【问题描述】:

我在一个 ArrayList 中有 5700 万个字符串,我想将它们插入到 HSQLDB 中。但我总是在处理过程中出现内存不足并出现 "java.lang.OutOfMemoryError: Java heap space""OutOfMemoryError: GC overhead limit exceeded" 错误。

我尝试了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 循环条件不会改变它。

我试过了

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于Java HSQLDB - 批量插入:OutOfMemoryError:超出 GC 开销限制的主要内容,如果未能解决你的问题,请参考以下文章

将列标题插入 hsqldb 文本文件

hsqldb-2.2.6 创建表并从脚本插入数据

hibernate hsqldb 标识列无法插入新字段

Java内存hsqldb

HSQLDB 和 SQuirreL 中的批量删除

设置文本表 hsqldb Java