java:写大文件?

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

目前我正在使用BufferedWriter

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

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

因此,例如

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

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

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

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

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

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

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