题
问候, 我得到的,从数据库中的记录数量庞大并写入到file.I想知道什么是最好的方式来写大文件。 (1GB - 的10Gb)。
目前我使用的BufferedWriter
BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
//do writings
}
mbrWriter.close();
解决方案
如果你真的坚持使用Java这一点,那么最好的办法是写的立即一旦数据进来,因此不收集的所有的数据从ResultSet
到Java的内存第一。你至少需要那么多的空闲内存在Java中并非如此。
因此,做e.g。
while (resultSet.next()) {
writer.write(resultSet.getString("columnname"));
// ...
}
这是说,最体面的DB的船舶与作为undoubtely方式更有效的比你所能做到在Java中内置出口到CSV能力。你没有提到你使用哪一个,但如果是例如MySQL,你可能已经使用了的 LOAD DATA INFILE
此。只是指具体的DB-文档。希望这给了新的见解。
其他提示
有一个的BufferedWriter默认的缓冲区大小为8192如果你将要书写squigabyte文件,你可能想提高这个使用2参数的构造函数; e.g。
int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);
此应减少写入文件所需的系统调用的数目。
但我怀疑这会做出比几个百分点的差异更多。从结果拉行很可能将是主要的性能瓶颈。对于业绩显著改善你需要使用数据库的本地批量导出工具。
Im不100%确定,但它似乎塔的BufferedReader将数据装载到一个缓冲在RAM中。 Java可以使用128MB RAM(除非另有说明),所以BufferedReader中可能会溢出Java的内存导致错误。尝试使用InputStreamReader和的FileInputStream读取,然后将数据存储在一个字符,然后只用一个FileOutputStream写炭。
不隶属于 StackOverflow