我有一个包含500,000个文件的目录。我想尽快访问它们。该算法要求我重复打开和关闭它们(不能同时打开500,000个文件)。
我怎样才能有效地做到这一点?我原本以为我可以缓存inode并以这种方式打开文件,但* nix没有提供通过inode打开文件的方法(安全性或其他一些)。
另一种选择是不要担心它,并希望FS在文件查找目录中做得很好。如果这是最好的选择,哪个FS最好。某些文件名模式是否比其他文件模式更快?例如01234.txt vs foo.txt
BTW这一切都在Linux上。
答案 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后端是一个选项吗?