2

可能重复:
将大量小文件读入内存的最快方法是什么?

我有大量的小文本文件(大小为 29 个字节),但其中有 1000 多个。

我正在尝试使用 BufferedReader 读取,但考虑到所有文件都存储在本地,它似乎很慢。我们已经尝试使用非常少量的这些文件(等 12 个)并且读取几乎是瞬时的。

是否有更有效的读取方式或缓冲区某处存在瓶颈?

谢谢!

4

2 回答 2

2

瓶颈最有可能出现在打开文件中,您对此无能为力。

(评论中链接的 Q&A 建议使用内存映射文件。但这直接与 Javadoc 相矛盾,Javadoc指出设置映射的开销很大,而且您只会从文件中获得回报。还有一个一点数学表明,他的基准测试使用平均大小为 5642 字节的文件……与 29 字节的文件大小相比,这是巨大的。)

获得牵引力的唯一方法是使用可以有效读取/加载的轻量级格式将小文件组合成一个大文件。除非您避免压缩,否则 ZIP 不是最好的主意。

于 2012-09-04T07:01:44.363 回答
2

打开和关闭文件非常慢,尤其是如果您有 HDD。典型的 HDD 的寻道时间为 8 毫秒或大约每秒 125 次。由于文件很小,因此阅读内容并不重要。

我同意内存映射文件只有在你有

  • 一个快速磁盘子系统,您的瓶颈不是您的驱动器。
  • 文件很大(GB 到 TB)

顺便说一句:如果您使用 SSD,它们可以执行大约 80K 到 230K IOPS,这要快得多。

唯一的其他解决方案是合并文件。读取 64 KB 文件与读取 29 字节文件所需时间大致相同,但可以存储数千倍的数据(并且需要的文件少数千倍)

于 2012-09-04T07:02:35.713 回答