问候, 我得到的,从数据库中的记录数量庞大并写入到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写炭。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top