java - new FileOutputStream 慢,有没有更好的办法?

标签 java io

我正在编写一堆相对较小的文件(每个大约 50k 左右)。

写入所有这些文件的总处理时间约为 400 秒。

我进行了一些检查,看看什么花费的时间最多,在这 400 秒中,12 秒用于将数据写入文件,380 秒用于执行此代码:

fos = new FileOutputStream(fileObj);

我预计文件的写入和关闭会花费大部分时间,但目前看来,创建 FileOutputStream 花费的时间最多。

有没有更好的方法来创建我的文件,或者文件创建通常是一个缓慢的操作?顺便说一下,这是数千个文件的总时间,而不仅仅是单个文件的时间。

最佳答案

您看到的是非常正常的行为,它不是特定于 java 的。

当一个文件被创建时,文件系统需要在其结构中添加一个文件条目,并在此过程中修改现有结构(例如文件所在的目录)以记录新条目。

在典型的硬盘上,这需要一些磁头移动,一次寻道需要毫秒级的时间。另一方面,一旦开始写入文件,文件系统将以线性方式(尽可能长)为文件分配新 block ,因此您可以以驱动器可以处理的最大速度写入顺序数据。

大幅提高速度的唯一方法是使用更快的设备(例如 SSD 驱动器)。

你几乎可以在任何地方观察到这种效果,Windows 资源管理器和类似工具都表现出相同的行为:大文件的复制速度接近设备限制,而大量小文件的速度非常慢。

关于java - new FileOutputStream 慢,有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188372/

相关文章:

java - 请帮我理解这行代码

java - 与线程相比,进程在上下文切换方面是否有任何开销?

java - 好的做法,传输 id 还是 DTO 对象?

java - 在线程 "main"java.lang.IndexOutOfBoundsException : No group 1 中得到异常

java - 如何关闭带有线程的java框架

java - 文件中最后读取的行打印为空

java - 根据列表优先级合并多个列表

c - 引用 fgets,\0 如何合并到普通文本文件中

r - 将 R read.csv 转换为 readLines 批处理?

命令末尾的 C++ std::stringstream 空格