Java HSQLDB - 批量插入 : OutOfMemoryError: GC overhead limit exceeded

标签 java sql garbage-collection batch-processing hsqldb

我在 ArrayList 中有 5700 万个字符串,我想将其插入到 HSQLDB 中。但我总是耗尽内存并在此过程中收到 “java.lang.OutOfMemoryError:Java 堆空间”“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 循环条件不会改变它。

我试过了

  • 更小和更大的批量
  • 在每次executeBatch()之后覆盖该语句
  • 语句在每次executeBatch()后关闭
  • 每次executeBatch()后提交

最佳答案

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

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

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

关于Java HSQLDB - 批量插入 : OutOfMemoryError: GC overhead limit exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42540345/

相关文章:

java - 将 double 转换为字符串并删除欧元符号货币

java - 从 Java 中过滤 Scala 集

sql - 按日期滚动求和的窗口函数

php - sql查询在两个表之间选择并更新这两个表之间的数据

java - 什么是用于实时系统的良好日志记录库(快速且不创建对象)?

java - Hibernate 5.2 中二级缓存实体的使用

java - 获取Hadoop Mapper中的总输入路径计数

c# - GCHandle.Alloc 是否分配内存?

php - 在一个查询中显示两个 MySQL 选择

c# - FileStream.Write() 抛出 OutOfMemoryException 的可能原因?