问候,我从数据库中获取大量记录并写入文件。我想知道编写大文件的最佳方法是什么。(1Gb - 10Gb)。
目前我正在使用 BufferedWriter
BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
//do writings
}
mbrWriter.close();
问候,我从数据库中获取大量记录并写入文件。我想知道编写大文件的最佳方法是什么。(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 功能,这无疑比您在 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 读取数据并将其存储在一个字符中,然后使用 FileOutputStream 写入该字符。