我有一个包含 15 万条记录的数据库。我想尽快将其写入文件。我尝试了很多方法,但似乎都很慢。我怎样才能让它更快?
我以 40k 为单位读取这些记录。所以首先我读了 40k,然后又读了 40k,依此类推。
读取记录后,此过程返回一个包含 40k 行的 StringBuilder。然后我们将这个 StringBuilder 写入一个文件。
private static void write(StringBuilder sb, Boolean append) throws Exception {
File file = File.createTempFile("foo", ".txt");
FileWriter writer = new FileWriter(file.getAbsoluteFile(), append);
PrintWriter out = new PrintWriter(writer);
try {
out.print(sb);
out.flush();
writer.flush();
} finally {
writer.close();
out.close();
}
}
我读了另一个例子,但它同样慢:Fastest way to write huge data in text file Java
我也用 NIO api 尝试过:
private static void write(StringBuilder sb, Boolean append)) throws Exception {
FileChannel rwChannel = new FileOutputStream("textfile.txt", true).getChannel();
ByteBuffer bb = ByteBuffer.wrap(sb.toString().getBytes("UTF-8"));
rwChannel.write(bb);
rwChannel.close();
}
将大量数据写入/追加到文件中的最佳方法是什么?
请您参考如下方法:
这里不需要PrintWriter
。如果您有任何类型的 Writer
(例如 FileWriter
),您可以简单地在其上调用 append(sb)
。而且你不需要flush
,close
意味着flushing。
private static void write(StringBuilder sb, Boolean append) throws Exception {
File file = File.createTempFile("foo", ".txt");
try(FileWriter writer = new FileWriter(file.getAbsoluteFile(), append)) {
writer.append(sb);
}
}
在我的系统上,使用 Channel
而不是 OutputStream
时,我遇到了一个小的性能改进:
private static void write0a(StringBuilder sb, Boolean append) throws Exception {
File file = File.createTempFile("foo", ".txt");
try(Writer writer = Channels.newWriter(new FileOutputStream(
file.getAbsoluteFile(), append).getChannel(), "UTF-8")) {
writer.append(sb);
}
}
然而,这些只是轻微的改进。我在这里看不到太多可能性,因为所有代码最终都会调用相同的例程。真正能提高性能的是在调用期间让 Writer 保持 Activity 状态,而不是刷新每条记录。