java:写大文件?

时间:2010-01-07 02:38:24

标签: java java-io bufferedwriter

问候, 我从数据库中获取大量记录并写入文件。我想知道编写大文件的最佳方法是什么。 (1Gb - 10Gb)。

目前我正在使用BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();

3 个答案:

答案 0 :(得分:9)

如果您真的坚持使用Java,那么最好的方法是在数据进入时立即写 ,从而不收集所有数据首先从ResultSet进入Java的内存。否则你至少需要Java中的那么多可用内存。

因此,例如。

while (resultSet.next()) {
    writer.write(resultSet.getString("columnname"));
    // ...
}

也就是说,大多数体面的DB都有内置的导出到CSV的功能,这些功能无疑比你在Java中的效率更高。你没有提到你正在使用哪一个,但如果它是例如MySQL,你可以使用LOAD DATA INFILE来实现。只需参考特定于DB的文档。希望这能带来新的见解。

答案 1 :(得分:4)

BufferedWriter的默认缓冲区大小是8192.如果您要编写squigabyte文件,可能需要使用2参数构造函数来增加它; e.g。

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

这应该减少写入文件所需的系统调用次数。

但我怀疑这会产生超过百分之几的差异。从结果集中提取行可能是主要的性能瓶颈。为了显着提高性能,您需要使用数据库的本地批量导出工具。

答案 2 :(得分:0)

我不是100%肯定,但看起来BufferedReader将数据加载到RAM中的Buffer中。 Java可以使用128mb Ram(除非另有说明),因此BufferedReader可能会溢出java的内存而导致错误。尝试使用InputStreamReader和FileInputStream来读取然后将数据存储在char中,然后使用FileOutputStream编写该char。