Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中高效地读取大量小文件_Java_File_Io - Fatal编程技术网

在Java中高效地读取大量小文件

在Java中高效地读取大量小文件,java,file,io,Java,File,Io,可能重复: 我有大量的小文本文件(大小为29字节),但其中有1000多个 我试图使用BufferedReader读入,但考虑到所有文件都存储在本地,速度似乎很慢。我们已经尝试了极少量的这些文件(ETC12),读取几乎是瞬间的 是否有更有效的读取方式,或者缓冲区中的某个地方存在瓶颈 谢谢 瓶颈最有可能是打开文件,对此你无能为力 (评论中链接的Q&A建议使用内存映射文件。但这直接与以下观点相矛盾:设置映射的开销很大,你只会得到大文件的回报。一点数学计算表明,他的基准测试使用的文件平均大小为5642

可能重复:

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

我试图使用BufferedReader读入,但考虑到所有文件都存储在本地,速度似乎很慢。我们已经尝试了极少量的这些文件(ETC12),读取几乎是瞬间的

是否有更有效的读取方式,或者缓冲区中的某个地方存在瓶颈


谢谢

瓶颈最有可能是打开文件,对此你无能为力

(评论中链接的Q&A建议使用内存映射文件。但这直接与以下观点相矛盾:设置映射的开销很大,你只会得到大文件的回报。一点数学计算表明,他的基准测试使用的文件平均大小为5642字节……这是一个巨大的补偿。)您的文件大小为29字节。)


唯一能吸引你的方法是使用一种轻量级格式将小文件合并成大文件,这种格式可以有效地读取/加载。除非避免压缩,否则压缩不是最好的方法。

打开和关闭文件非常慢,特别是如果你有HDD的话。通常HDD的寻道时间为8 ms或约125 p呃第二,因为文件太小了,阅读内容其实并不重要

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

  • 一个快速磁盘子系统,其中瓶颈不是驱动器
  • 文件太大(GB到TB)
顺便说一句:如果你使用SSD,他们可以执行大约80K到230K IOPS,这是相当快一点


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

你能压缩所有文件并使用某种union fs风格的虚拟文件系统吗?@Keppil-但请看我的答案,以反驳这个问题。如果你能为我们提供更多关于你的问题的背景,那么天才们可能会想出其他解决方案来加快速度。例如,不生成1000多个小文件,你能继续吗附加到同一个文件?或者,也许使用一些并发编程技术可以帮助提高您的性能?@StephenC:他在链接问题中显示的测试结果似乎非常令人印象深刻,但我认为这非常值得一试。@Keppil-从答案中可以看出“我在rt.jar类文件上运行了它,并将其解压缩到硬盘上,这是在Windows7 beta x64下运行的。这是16784个文件,总共94706637字节。"。这是5642字节的平均大小,与OP的用例相比,这是巨大的。感谢您的建议!另一个考虑因素是文件是动态生成的,每个文件的信息都必须在创建时显示。我不能将所有文件合并成一个大文件,然后再显示稍后再讨论。@user990639-动态生成它们并不意味着不能将它们组合在一起,只是意味着需要以不同的方式生成它们。