在一个目录中保存多少文件有关系吗?如果是,一个目录中有多少文件是太多的,拥有太多文件的影响是什么?(这是在Linux服务器上。)

Background: I have a photo album website, and every image uploaded is renamed to an 8-hex-digit id (say, a58f375c.jpg). This is to avoid filename conflicts (if lots of "IMG0001.JPG" files are uploaded, for example). The original filename and any useful metadata is stored in a database. Right now, I have somewhere around 1500 files in the images directory. This makes listing the files in the directory (through FTP or SSH client) take a few seconds. But I can't see that it has any effect other than that. In particular, there doesn't seem to be any impact on how quickly an image file is served to the user.

我想过通过创建16个子目录来减少图像的数量:0-9和a-f。然后我将根据文件名的第一个十六进制数字将图像移动到子目录中。但是除了偶尔通过FTP/SSH列出目录之外,我不确定这样做是否有任何理由。


当前回答

我记得我运行了一个程序,它在输出时创建了大量的文件。每个目录按30000个文件进行排序。当我不得不重用产生的输出时,我不记得有任何读取问题。它是在一台32位的Ubuntu Linux笔记本电脑上,甚至Nautilus也显示了目录内容,尽管要等几秒钟。

ext3文件系统:类似的代码在64位系统上处理每个目录64000个文件。

其他回答

这在一定程度上取决于Linux服务器上使用的特定文件系统。现在默认是ext3和dir_index,这使得搜索大目录非常快。

所以速度不应该是一个问题,除了你已经注意到的问题,那就是上市需要更长的时间。

一个目录下的文件总数是有限制的。我记得它可以运行到32000个文件。

请记住,在Linux上,如果目录中有太多文件,shell可能无法展开通配符。我在Linux上托管的相册有这个问题。它将所有调整大小的图像存储在一个目录中。虽然文件系统可以处理许多文件,但shell不能。例子:

-shell-3.00$ ls A*
-shell: /bin/ls: Argument list too long

or

-shell-3.00$ chmod 644 *jpg
-shell: /bin/chmod: Argument list too long

不是答案,只是一些建议。

选择一个更合适的FS(文件系统)。因为从历史的角度来看,你们所有的问题都是足够明智的,在过去几十年里曾经是金融服务体系演变的核心。我的意思是更现代的FS更好地支持你的问题。首先从FS列表中做出一个基于你最终目的的比较决策表。

我认为是时候改变你的思维模式了。所以我个人建议使用分布式系统支持的FS,这意味着在大小、文件数量等方面没有任何限制。否则,你迟早会遇到意想不到的新问题。

我不确定这是否有效,但如果您没有提到一些实验,请尝试一下当前文件系统上的AUFS。我想它可以将多个文件夹模拟为单个虚拟文件夹。

为了克服硬件限制,可以使用RAID-0。

这实际上取决于所使用的文件系统,以及一些标志。

例如,ext3可以有数千个文件;但在几千次之后,它就变得非常缓慢了。主要是在列出目录时,但也在打开单个文件时。几年前,它获得了“htree”选项,这极大地缩短了给定文件名获取inode所需的时间。

就我个人而言,我使用子目录将大多数级别保持在1000个左右的项目以下。在您的例子中,我将创建256个目录,使用ID的最后两个十六进制数字。使用最后一个数字,而不是第一个数字,这样可以实现负载平衡。

如果实现目录分区方案所涉及的时间是最少的,我赞成它。当您第一次调试涉及通过控制台操作10,000个文件目录的问题时,您将能够理解。

例如,F-Spot将照片文件存储为YYYY\MM\DD\filename。ext,这意味着在手动操作我的~20000张照片集合时,我必须处理的最大目录大约有800个文件。这也使文件更容易从第三方应用程序中浏览。永远不要以为只有你的软件会访问你的软件文件。