用Java有效地读取大量小文件

时间:2012-09-04 06:50:25

标签: java file io

  

可能重复:
  What is the fastest way to read a large number of small files into memory?

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

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

是否有更有效的阅读方式或缓冲区中的某个瓶颈?

谢谢!

2 个答案:

答案 0 :(得分:2)

打开和关闭文件非常慢,特别是如果你有硬盘。典型的HDD具有8ms的寻道时间或每秒约125的寻道时间。由于文件太小,阅读内容并不重要。

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

时才有意义
  • 一个快速磁盘子系统,您的瓶颈不是您的驱动器。
  • 文件很大(GB到TB)
BTW:如果您使用的是SSD,它们可以执行大约80K到230K的IOPS,速度要快得多。

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

答案 1 :(得分:1)

瓶颈最有可能是打开文件,而且你可以做很多事情。

(评论中链接的Q& A建议使用内存映射文件。但这与Javadoc直接相矛盾,{{3}}表明设置映射的开销很大,而且你只会得到一个大型文件的回报。一些数学表明他的基准测试使用平均大小为5642字节的文件......与29字节的文件大小相比这是巨大的。)

如果您将小文件组合成一个较大的文件,使用可以有效读取/加载的轻量级格式,那么您将获得牵引力的唯一方法就是如此。除非你避免压缩,否则ZIP不是最佳选择。