我有一个包含 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)。而且你不需要flushclose意味着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 状态,而不是刷新每条记录。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!