如果单个目录中有1,000,000个单独的文件(大多数是100k),那么平坦(没有其他目录和文件),在任何其他可能的方式中,效率或缺点是否会有任何妥协?< / p>
答案 0 :(得分:6)
ARG_MAX会对此产生问题......例如,rm -rf *(在目录中)会说“参数太多”。想要做某种globbing(或shell)的实用程序会有一些功能中断。
如果该目录可供公众使用(例如通过ftp或Web服务器),则可能会遇到其他问题。
对任何给定文件系统的影响完全取决于该文件系统。这些文件的访问频率是多少,文件系统是什么?请记住,Linux(默认情况下)更喜欢将最近访问的文件保存在内存中,同时根据您的设置将进程置于交换状态。这个目录是通过http提供的吗? Google是否会看到并抓取它?如果是这样,您可能需要调整VFS缓存压力和swappiness。
修改强>
ARG_MAX是一个系统范围限制,可以向程序的入口点提供多少个参数。所以,让我们拿'rm'和示例“rm -rf *” - shell将'*'转换为空格分隔的文件列表,这些文件又成为'rm'的参数。
同样的事情将发生在ls和其他一些工具上。例如,如果有太多文件以'foo'开头,ls foo *可能会中断。
我建议(无论使用什么fs)将其分解为更小的目录块,仅仅是出于这个原因。
答案 1 :(得分:3)
当您意外地在该目录中执行“ls”,或使用制表符完成,或者想要执行“rm *”时,您将遇到大麻烦。此外,根据您的文件系统,可能会出现性能问题。
将文件分组到由文件名的前2个或3个字符命名的目录中是一种很好的做法,例如
aaa/ aaavnj78t93ufjw4390 aaavoj78trewrwrwrwenjk983 aaaz84390842092njk423 ... abc/ abckhr89032423 abcnjjkth29085242nw ... ...
答案 2 :(得分:3)
默认情况下,大多数发行版使用Ext3,可以对大型目录使用b-tree索引。
某些发行版默认启用此dir_index
功能,而其他发行版则必须自行启用。如果启用它,即使数百万个文件也没有减速。
要查看dir_index
功能是否已激活(以root身份):
tune2fs -l /dev/sdaX | grep features
激活dir_index功能(以root身份):
tune2fs -O dir_index /dev/sdaX
e2fsck -D /dev/sdaX
将/dev/sdaX
替换为您要激活它的分区。
答案 3 :(得分:3)
我在ext3和dir_index
启用了大型目录的经验:
ls
),则首次需要几分钟。然后该目录将保留在内核缓存中,不再有任何惩罚*
)并不总是按预期工作。仅当您确实想要一次对所有文件执行操作时然而,如果没有dir_index
,你真的搞砸了:-D
答案 4 :(得分:0)
显而易见的答案是,在任何技术限制之前,人类很难长时间使用文件夹,(从ls读取输出所需的时间,其他几十个原因)是否有充分的理由让你能够分成子文件夹?
答案 5 :(得分:0)
并非每个文件系统都支持那么多文件。
在其中一些(ext2,ext3,ext4)上,很容易达到inode限制。