Linux上的最大文件/目录数?

Linux上的最大文件/目录数?,linux,directory,directory-structure,Linux,Directory,Directory Structure,我正在开发一个LAMP在线商店,它允许管理员上传每个商品的多张图片 我担心的是——马上就会有20000个项目,意味着大约60000张图片 问题: Linux上文件和/或目录的最大数量是多少 处理这种情况的通常方法是什么(最佳实践) 我的想法是根据每个项目的唯一ID为每个项目创建一个目录,但在主上载目录中我仍然有20000个目录,并且它将无限期地增长,因为旧项目不会被删除 感谢您的帮助。如果您的服务器文件系统已启用了目录索引功能(有关检查和启用该功能的详细信息,请参阅tune2fs(8)),那么在

我正在开发一个LAMP在线商店,它允许管理员上传每个商品的多张图片

我担心的是——马上就会有20000个项目,意味着大约60000张图片

问题:

  • Linux上文件和/或目录的最大数量是多少

  • 处理这种情况的通常方法是什么(最佳实践)

  • 我的想法是根据每个项目的唯一ID为每个项目创建一个目录,但在主上载目录中我仍然有20000个目录,并且它将无限期地增长,因为旧项目不会被删除


    感谢您的帮助。

    如果您的服务器文件系统已启用了
    目录索引
    功能(有关检查和启用该功能的详细信息,请参阅
    tune2fs(8)
    ),那么在性能下降之前,您可以在一个目录中合理地存储100000多个文件。(
    dir\u index
    是大多数发行版的新文件系统的默认设置,因此它只会是默认情况下不启用该功能的旧文件系统。)

    这就是说,添加另一个目录级别以将目录中的文件数减少16或256倍,这将极大地提高
    ls*
    这样的事情在不过度运行内核的最大
    argv
    大小的情况下工作的可能性

    通常,这是通过以下方式完成的:

    /a/a1111
    /a/a1112
    ...
    /b/b1111
    ...
    /c/c6565
    ...
    

    i、 例如,在路径前加上一个字母或数字,根据你可以计算出的某个特征。(文件名的
    md5sum
    sha1sum
    的前两个字符是一种常见的方法,但是如果您有唯一的对象id,那么
    'a'+id%16
    就很容易确定要使用哪个目录。)

    60000也算不了什么,20000也算不了什么。但为了加快访问速度,您应该以任何方式将这20000个组放入其中。可能是以100或1000为一组,取目录号除以1005001000,随便什么

    例如,我有一个项目,其中文件有编号。我把它们分成1000组,所以

    id/1/1332
    id/3/3256
    id/12/12334
    id/350/350934
    


    实际上,您可能有一个硬限制—某些系统有32位inode,因此每个文件系统的inode数限制为2^32。

    ext[234]文件系统有固定的最大inode数;每个文件或目录都需要一个inode。您可以使用
    df-i
    查看当前计数和限制。例如,在使用默认设置创建的15GB ext3文件系统上:

    Filesystem           Inodes  IUsed   IFree IUse% Mounted on
    /dev/xvda           1933312 134815 1798497    7% /
    
    除此之外,目录没有任何限制;请记住,每个文件或目录至少需要一个文件系统块(通常为4KB),即使它是一个只有一个项目的目录

    但是,正如您所看到的,80000个inode不太可能成为问题。使用
    dir_index
    选项(可通过
    tune2fs
    启用),在大目录中查找并不是什么大问题。但是,请注意,许多管理工具(如
    ls
    rm
    )可能很难处理其中包含过多文件的目录。因此,建议您将文件拆分,以便在任何给定目录中的项目不会超过几百到一千个。一个简单的方法是散列您正在使用的任何ID,并使用前几个十六进制数字作为中间目录


    例如,假设您有项目ID 12345,它散列到
    “DEADBEEF02842…”
    。您可以将文件存储在
    /storage/root/d/e/12345
    下。现在,您已经将每个目录中的文件数量减少了1/256。

    除了一般的答案(基本上是“不要太麻烦”,“调优您的文件系统”和“用每个包含数千个文件的子目录组织您的目录”):


    如果单个图像很小(例如,小于几千字节),您也可以将它们放在数据库(例如,使用MySQL作为数据库)或索引文件中,而不是放在文件夹中。这样,每个小条目就不会占用一个inode(在许多文件系统上,每个inode至少需要一些KB)。您也可以对某些阈值执行此操作(例如,将大于4KB的图像放在单个文件中,将较小的图像放在数据库或GDBM文件中)。当然,不要忘记备份数据(并定义备份策略)。

    今年是2014年。我及时回来补充这个答案。 很多大/小文件?您可以使用amazons3和其他基于Ceph的替代方案,比如DreamObjects,它们没有目录限制


    我希望这有助于人们从所有备选方案中做出决定。

    在默认的mke2fs设置上,在inode表中开始有足够的空间容纳2^32个inode之前,您需要几十TB的磁盘空间:)等几年,我们就到了……:-)等待。。。事实上,这是一种很好的减少磁盘使用的机制,但可以防止零拷贝机制,如
    sendfile(2)
    ,在没有进一步的服务器软件干预的情况下传输文件。我知道这是一个老帖子。。。但经过一番挖掘,还是找不到像样的东西。有没有一种特定的散列方法可以让你期望特定的字母数字字符能够存储在不同的文件夹中?@Jish我不明白。您可以使用任何哈希函数,将其结果转换为十六进制并获取前两个十六进制数字。然后,理想情况下,这两个数字在
    [0-9a-f]
    之间的分布是相等的。我刚刚在目录中生成了大约150000个文件,但ls命令无法使用ls myfile*命令列出它们。但是因为我知道文件名,所以我试着打开了第一个和最后一个文件。所以我知道这些文件是存在的。啊,讽刺的是。。。。我发现自己读这篇文章是因为我下载了2个月的AWS CloudTrail日志,因为没有更好的方法来使用它们。似乎每天大约有300个json文件。乘以60天。我有大约18000卷
    md5($id) ==> 0123456789ABCDEF
    
    $file_path = items/012/345/678/9AB/CDE/F.jpg 
    
    1 node = 4096 subnodes (fast)