从一个目录读取许多小文件有多大问题?

Posted

技术标签:

【中文标题】从一个目录读取许多小文件有多大问题?【英文标题】:How problematic is it to read many small files from one directory? 【发布时间】:2016-09-12 12:02:01 【问题描述】:

我必须阅读许多(最多 5 mio.)小 (9 KB) 文件。目前它们都在一个目录中。我担心这将花费二次时间甚至 n^2 log n 进行查找,对吗?这是否重要(查找是否会比实际阅读花费更多时间)?当文件被操作系统缓存时,运行时间的渐近行为是否存在差异?

我使用 C++ 流来读取文件。目前我使用的是带有 NTFS 的 Windows 7,但稍后我将在 linux 集群上运行该程序(不确定是哪个文件系统)。

【问题讨论】:

使用内存映射 I/O。根据我的测试,这是您可以做出的最大的文件 I/O 性能改进。 你能改变一个目录的限制吗?您可以在这里找到一些有用的信息:***.com/questions/8238860/… 【参考方案1】:

这可能没那么糟糕:如果您枚举文件,并在遇到每个文件名时对其进行处理,您的操作系统很可能在其磁盘缓存中具有目录条目。出于实际目的,磁盘缓存是 O(1)。

杀死你的是机械硬盘。您将有 500 万次磁盘查找,每次查找大约需要 1/100 秒。那是 50.000 秒,超过半天。这是一项需要 SSD 的任务。

【讨论】:

以上是关于从一个目录读取许多小文件有多大问题?的主要内容,如果未能解决你的问题,请参考以下文章

微信小程度的市场有多大,店长宝告诉你

在 NTFS 上打开许多小文件太慢了

小公司程序员的编程水平与BAT大厂相比,有多大差距?

Spark缓慢重新分区许多小文件

动态分配许多小块内存

tcp协议黏包问题的解决方式