gpt4 book ai didi

java - 用 Java 快速编写数百万个小文本文件的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:45 29 4
gpt4 key购买 nike

我必须转储包含大约 100-200 个字符的 600 万个文件,而且速度非常慢。实际慢的部分是文件写入,如果我注释掉该部分(调用 WriteSoveraFile 方法),整个过程将在 5-10 分钟内运行。事实上,我整夜运行它(16 小时)并完成了 200 万条记录。

  1. 有没有更快的方法?

  2. 创建一个数组数组然后一次性全部转储会更好吗? (我的系统只有4GB,这样消耗6GB的数据不会死吗?)

程序如下:

public static void WriteSoveraFile(String fileName, String path, String contents) throws IOException {

BufferedWriter bw = null;

try {
String outputFolderPath = cloGetAsFile( GenCCD.o_OutER7Folder ).getAbsolutePath() ;
File folder = new File( String.format("%1$s/Sovera/%2$s/", outputFolderPath, path) );

if (! folder.exists()) {
folder.mkdirs();

/* if (this.rcmdWriter != null)
this.rcmdWriter.close();
*/
}

File file = new File( String.format("%1$s/%2$s", folder.getAbsolutePath(),fileName) );

// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
FileWriter fw = new FileWriter(file.getAbsoluteFile());
bw = new BufferedWriter(fw);
bw.write(contents);
bw.close();
}
/* else {
file.delete(); // want to delete the file?? or just overwrite it??
file.createNewFile();*/

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) bw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

最佳答案

这几乎可以肯定是操作系统文件系统问题;写很多文件很慢。我建议在 shell 和 C 中编写一个比较测试,以了解操作系统的贡献有多大。此外,我建议进行两项重大调整:

  • 确保运行它的系统正在使用 SSD。寻找文件系统日志的延迟将是开销的主要来源。
  • 多线程处理您的写作过程。序列化后,操作系统无法执行批量操作写入等优化,FileWriter 可能会阻塞在close() 操作上。

(我打算建议研究 NIO,但 API 似乎并没有为您的情况提供太多好处,因为设置一个映射缓冲区可能会引入比为这个大小节省的开销更多的开销。)

关于java - 用 Java 快速编写数百万个小文本文件的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426111/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com