可能重复:
将大量小文件读入内存的最快方法是什么?
我有大量的小文本文件(大小为 29 个字节),但其中有 1000 多个。
我正在尝试使用 BufferedReader 读取,但考虑到所有文件都存储在本地,它似乎很慢。我们已经尝试使用非常少量的这些文件(等 12 个)并且读取几乎是瞬时的。
是否有更有效的读取方式或缓冲区某处存在瓶颈?
谢谢!
可能重复:
将大量小文件读入内存的最快方法是什么?
我有大量的小文本文件(大小为 29 个字节),但其中有 1000 多个。
我正在尝试使用 BufferedReader 读取,但考虑到所有文件都存储在本地,它似乎很慢。我们已经尝试使用非常少量的这些文件(等 12 个)并且读取几乎是瞬时的。
是否有更有效的读取方式或缓冲区某处存在瓶颈?
谢谢!
瓶颈最有可能出现在打开文件中,您对此无能为力。
(评论中链接的 Q&A 建议使用内存映射文件。但这直接与 Javadoc 相矛盾,Javadoc指出设置映射的开销很大,而且您只会从大文件中获得回报。还有一个一点数学表明,他的基准测试使用平均大小为 5642 字节的文件……与 29 字节的文件大小相比,这是巨大的。)
获得牵引力的唯一方法是使用可以有效读取/加载的轻量级格式将小文件组合成一个大文件。除非您避免压缩,否则 ZIP 不是最好的主意。
打开和关闭文件非常慢,尤其是如果您有 HDD。典型的 HDD 的寻道时间为 8 毫秒或大约每秒 125 次。由于文件很小,因此阅读内容并不重要。
我同意内存映射文件只有在你有
顺便说一句:如果您使用 SSD,它们可以执行大约 80K 到 230K IOPS,这要快得多。
唯一的其他解决方案是合并文件。读取 64 KB 文件与读取 29 字节文件所需时间大致相同,但可以存储数千倍的数据(并且需要的文件少数千倍)