缓冲写入数据库以避免 OutOfMemoryError
Buffered writing to database to avoid OutOfMemoryError
假设您有以下代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new File("MyFile.txt")));
FooParser parser = new FooParser();
List<Foo> fooList = new ArrayList<Foo>();
try {
String line = br.readLine();
while (line != null && !line.isEmpty()) {
Foo foo = parser.parse(line);
fooList.add(foo);
line = br.readLine();
}
} catch (IOException ioe) {
// handle it
}
稍后该列表用于通过以下调用将对象写入数据库(确切地说是 PostgreSQL):
dao.write(fooList);
现在,上面的代码可能看起来简单易懂,但是,当您的列表中的 Foo
个对象过多时,就会出现问题,以至于导致 OutOfMemoryError
。
所以,我想知道是否存在某种模式或约定如何执行 'buffered' 写入数据库,以避免在内存中保留大量对象,这些对象最终会存储在数据库中?
受 BufferedOutputStream
的启发,我正在考虑沿着这些路线前进,保留对象的缓冲区(长度可配置),一旦缓冲区填满,写入并刷新到 dabatase。
由于我对此束手无策(我只能修复小错误,不能更改架构),这是否足够好and/or还有更好的方法吗?
谢谢 :D
您必须添加某种缓冲逻辑。我的缓冲区大小是“100”,如下所示。
String line = br.readLine();
while (line != null && !line.isEmpty()) {
Foo foo = parser.parse(line);
fooList.add(foo);
if(fooList.size() == 100){
dao.write(fooList);
fooList = new ArrayList<Foo>();
}
line = br.readLine();
}
假设您有以下代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new File("MyFile.txt")));
FooParser parser = new FooParser();
List<Foo> fooList = new ArrayList<Foo>();
try {
String line = br.readLine();
while (line != null && !line.isEmpty()) {
Foo foo = parser.parse(line);
fooList.add(foo);
line = br.readLine();
}
} catch (IOException ioe) {
// handle it
}
稍后该列表用于通过以下调用将对象写入数据库(确切地说是 PostgreSQL):
dao.write(fooList);
现在,上面的代码可能看起来简单易懂,但是,当您的列表中的 Foo
个对象过多时,就会出现问题,以至于导致 OutOfMemoryError
。
所以,我想知道是否存在某种模式或约定如何执行 'buffered' 写入数据库,以避免在内存中保留大量对象,这些对象最终会存储在数据库中?
受 BufferedOutputStream
的启发,我正在考虑沿着这些路线前进,保留对象的缓冲区(长度可配置),一旦缓冲区填满,写入并刷新到 dabatase。
由于我对此束手无策(我只能修复小错误,不能更改架构),这是否足够好and/or还有更好的方法吗?
谢谢 :D
您必须添加某种缓冲逻辑。我的缓冲区大小是“100”,如下所示。
String line = br.readLine();
while (line != null && !line.isEmpty()) {
Foo foo = parser.parse(line);
fooList.add(foo);
if(fooList.size() == 100){
dao.write(fooList);
fooList = new ArrayList<Foo>();
}
line = br.readLine();
}