【发布时间】: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() 之后提交
【问题讨论】:
标签: java sql garbage-collection batch-processing hsqldb