我有一个包含1000个文件的目录,readdir()
需要的时间不到1秒,但是10000个文件需要大约24秒。
为什么?它应该是线性的。
有人能解释一下原因吗?
如果我只需要在一个目录中获取文件和子目录名,是否有更好的解决方案?
编辑
我在本地的Linux电脑上。
最佳答案
它可能是特定于文件系统的。也许使用适当配置的Ext4或BTRFS文件系统应该会有所帮助。一些文件系统使用散列或B-树技术,使大小为n的目录中文件访问的复杂性为O(log n),其他文件仍然是线性的,例如O(n),而内核可能会在上面做一些奇怪的事情。
在大型目录中使用的shell通常在globbing时对条目进行排序(另请参见glob(7))。而且你不希望它的auto-completion每次按键都能持续很多秒!
我认为你永远不应该有巨大的目录(例如,有超过几百个条目),所以在一个目录中有10000个文件是不合理的。如果是这样的话,你最好用不同的方式组织你的文件,例如subdir01/file001.txt
。sbudir99/file999.txt
顺便说一句,如果您需要一些文本键来访问许多小东西,那么使用索引文件(如gdbm)或Sqlite“数据库”或真正的数据库(PostGreSQL,MongoDb…)更合适,而且可能更高效。不要忘记转储数据(可能是某种文本格式)以备备份。
注意,Linux上的readdir(3)和POSIX readdir的文档没有提及任何时间复杂度或任何线性行为。这种不提是很重要的。
在常用的FAT文件系统(例如在许多USB密钥上),时间复杂度可能是二次的。
关于c - 为什么Linux中的readdir()调用非线性增长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26907304/