我正在编写一堆相对较小的文件(每个大约 50k 左右)。
写入所有这些文件的总处理时间约为 400 秒。
我进行了一些检查,看看什么花费的时间最多,在这 400 秒中,12 秒用于将数据写入文件,380 秒用于执行此代码:
fos = new FileOutputStream(fileObj);
我预计文件的写入和关闭会花费大部分时间,但目前看来,创建 FileOutputStream 花费的时间最多。
有没有更好的方法来创建我的文件,或者文件创建通常是一个缓慢的操作?顺便说一下,这是数千个文件的总时间,而不仅仅是单个文件的时间。
最佳答案
您看到的是非常正常的行为,它不是特定于 java 的。
当一个文件被创建时,文件系统需要在其结构中添加一个文件条目,并在此过程中修改现有结构(例如文件所在的目录)以记录新条目。
在典型的硬盘上,这需要一些磁头移动,一次寻道需要毫秒级的时间。另一方面,一旦开始写入文件,文件系统将以线性方式(尽可能长)为文件分配新 block ,因此您可以以驱动器可以处理的最大速度写入顺序数据。
大幅提高速度的唯一方法是使用更快的设备(例如 SSD 驱动器)。
你几乎可以在任何地方观察到这种效果,Windows 资源管理器和类似工具都表现出相同的行为:大文件的复制速度接近设备限制,而大量小文件的速度非常慢。
关于java - new FileOutputStream 慢,有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188372/