在包含500,000个文件的目录中快速访问文件

时间:2008-11-21 22:02:16

标签: c++ linux file-io filesystems inode

我有一个包含500,000个文件的目录。我想尽快访问它们。该算法要求我重复打开和关闭它们(不能同时打开500,000个文件)。

我怎样才能有效地做到这一点?我原本以为我可以缓存inode并以这种方式打开文件,但* nix没有提供通过inode打开文件的方法(安全性或其他一些)。

另一种选择是不要担心它,并希望FS在文件查找目录中做得很好。如果这是最好的选择,哪个FS最好。某些文件名模式是否比其他文件模式更快?例如01234.txt vs foo.txt

BTW这一切都在Linux上。

5 个答案:

答案 0 :(得分:7)

假设您的文件系统为ext3,如果启用了dir_index,则会使用散列B树索引您的目录。这将为您提供与您可以在应用程序中编码的任何内容相同的推动力。

如果目录已编入索引,则文件命名方案无关紧要。

http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/

答案 1 :(得分:5)

一些想法:

a)如果您可以控制目录布局,则将文件放入子目录。

b)如果您无法移动文件,那么您可能会尝试不同的文件系统,我认为xfs可能适用于包含大量条目的目录?

答案 2 :(得分:2)

如果你有足够的内存,你可以使用ulimit来增加你的进程一次可以打开的文件的最大数量,我已经成功完成了100,000个文件,500,000也可以工作。

如果这不适合您,请尝试确保您的dentry缓存有足够的空间来存储所有条目。 dentry缓存是文件名 - >内核用于根据文件名加速文件访问的inode映射,访问大量不同的文件可以有效地消除dentry缓存的好处,并引入额外的性能损失。库存2.6内核中一次有一个最多256 * MB RAM条目的哈希值,如果你有2GB内存,那么你应该可以获得多达500,000多个文件。

当然,请确保执行适当的分析以确定这是否真的导致了瓶颈。

答案 3 :(得分:2)

传统的方法是使用散列子目录。假设您的文件名都是均匀分布的哈希值,以十六进制编码。然后,您可以根据文件名的前两个字符创建256个目录(例如,文件012345678将命名为01/2345678)。如果还不够,可以使用两个甚至更多级别。

只要文件名统一分布,就可以保持目录大小的可管理性,从而加快对它们的操作。

答案 4 :(得分:0)

另一个问题是文件中有多少数据? SQL后端是一个选项吗?