2014-06-19 63 views
1

我有一个巨大的结果集,包括100万行。我通常使用下面的代码片段将它们写入文件,而我总是内存不足。有没有有效的方法来消除这个问题?将巨大的行写入文件

PrintWriter writer = new PrintWriter(filename, "UTF-8"); 
iteration -> { writer.println(a single string); } 

writer.close(); 
+2

调查缓冲。这样,你只需要消耗尽可能多的内存。 – dkoch74

+1

尝试在打印后清空作者。 – QBrute

+2

不要一次完成整个文件。把它分成块。 –

回答

1

既然你说过ResultSet,我认为这是来自数据库?首先,使用流式结果集。 MySQL的JDBC驱动程序喜欢在内存中缓冲全部行,并且使用1M(或1B)行,这可能是一个问题。

如果您希望按比例缩放,请以螺纹方式执行此操作。让一个线程(生产者)从ResultSet中读取行,另一个线程(消费者)将行写入文件。类似于ArrayBlockingQueue的东西对此非常有用。如果消费者无法跟上生产者的步伐,就要开始阻止,并等待消费者赶上。这种方法占用更少的内存,并且速度更快,因为您的IO正在并行完成。

+1

PostgreSQL btw也是如此。你会想设置一个fetchSize。 –