【问题标题】:Read large number of small files efficiently in Java [duplicate]在Java中有效地读取大量小文件[重复]
【发布时间】:2012-09-04 06:50:25
【问题描述】:

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

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

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

有没有更有效的读取方式或者缓冲区的某个地方存在瓶颈?

谢谢!

【问题讨论】:

  • 你能压缩所有文件并使用某种 union-fs 风格的虚拟文件系统吗?
  • @Keppil - 但请参阅我的答案以反驳该问题。
  • 如果您可以就您的问题向我们提供更多背景信息,也许 SO 方面的天才可以提出可以加快处理速度的替代解决方案。例如,您可以继续追加到同一个文件,而不是生成 1000 多个小文件吗?或者,也许使用一些并发编程技术可以帮助您提高性能?
  • @StephenC:他在链接问题中显示的测试结果似乎相当令人印象深刻,我认为这值得一试。
  • @Keppil - 来自答案“我在 rt.jar 类文件上运行它,提取到硬盘驱动器,这是在 Windows 7 beta x64 下。即 16784 个文件,总共 94,706,637 字节."。这是 5642 字节的平均大小,与 OP 的用例相比,这是巨大的。

标签: java file io


【解决方案1】:

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

(在 cmets 中链接的问答建议使用内存映射文件。但这直接与 Javadoc 相矛盾,Javadoc 指出设置映射的开销很大,你只会得到回报个文件。一些数学运算表明,他的基准测试使用的文件平均大小为 5642 字节……与您的 29 字节文件大小相比,这是巨大的。)

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

【讨论】:

  • 感谢您的建议!另一个考虑是文件是动态生成的,每个文件的信息必须在创建时显示。我不能将所有文件合并成一个大文件,然后再显示。
  • @user990639 - 它们是动态生成的这一事实并不意味着您不能将它们组合起来。这只是意味着您需要以不同的方式生成它们。
【解决方案2】:

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

我同意内存映射文件只有在你有的时候才有意义

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多