c - 为什么 linux 中的 readdir() 调用呈非线性增长

标签 c linux

我有一个包含 1000 个文件的目录,readdir() 用时不到 1 秒,但是 10000 个文件用了大约 24 秒。

为什么?它应该是线性的。

谁能解释一下原因。 如果我只需要获取目录中的文件和子目录名称,是否有更好的解决方案?

编辑 我在我本地的 Linux 电脑上。

最佳答案

它可能是特定于文件系统的。也许使用适当配置的 Ext4BTRFS文件系统应该有帮助。一些文件系统使用散列或 B 树技术使大小为 N 的目录中的文件访问复杂度为 O(log N),其他文件系统仍然是线性的,例如O(N),内核可能会在上面做一些奇怪的事情。

您可能在大型目录中使用的 shell 通常会在 globbing 时对条目进行排序(另请参见 glob(7))。你不想要它的 auto-completion每次击键持续数秒!

我相信你不应该永远拥有巨大的目录(例如超过几百个条目),所以一个目录中有 10000 个文件是不合理的。如果是这种情况,您最好以不同的方式组织文件,例如subdir01/file001.txt ... sbudir99/file999.txt

顺便说一句,如果您需要通过一些文本键访问很多小东西,请使用索引文件(如 gdbm )或 Sqlite “数据库”,或一个真实的数据库( PostGreSQLMongoDb ...)更合适,而且可能更有效。不要忘记转储数据(可能是某种文本格式)以进行备份。

请注意 readdir(3) 的文档在 Linux 和 POSIX 上 readdir不要提及任何时间复杂度或任何线性行为。这种未提及的情况很重要。 关于常用FAT文件系统(例如在许多 USB key 上)时间复杂度可能是二次方的。

关于c - 为什么 linux 中的 readdir() 调用呈非线性增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26907304/

相关文章:

c - C 中使用分隔符分割字符串

linux - 使用 Ubuntu 内核进行更改

linux - 如何使用 bash 从文件中提取特定行

c - 通过覆盖 %n 生成 root shell 的 Setuid 二进制文件,不适用于漏洞利用,但在不需要利用时工作

c - C 函数中未声明的标识符

linux - 在 perl grep 中模拟 linux grep -w

linux - mac OS X 和 linux 之间的 rsync 所有权

linux - 为什么 Linux grep 没有给出正确的换行符计数?

c - Raspberry pi 上的 Libusb 问题

c - 为什么“while(!feof(file))”总是错误的?