Linux上的最大文件/文件夹数量?

Cod*_*oso 48 linux directory directory-structure

我正在开发一个LAMP在线商店,它将允许管理员为每个项目上传多个图像.

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

问题:

  1. Linux上的文件和/或文件夹的最大数量是多少?

  2. 处理这种情况的常用方法是什么(最佳实践)?

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

谢谢你的帮助.

bdo*_*lan 74

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

Filesystem           Inodes  IUsed   IFree IUse% Mounted on
/dev/xvda           1933312 134815 1798497    7% /
Run Code Online (Sandbox Code Playgroud)

除此之外,对目录没有限制; 请记住,每个文件或目录至少需要一个文件系统块(通常为4KB),即使它是一个只有一个项目的目录.

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

例如,假设您有项目ID 12345,并且它具有哈希值'DEADBEEF02842.......'.您可以将文件存储在/storage/root/d/e/12345.您现在已将每个目录中的文件数减少了1/256.

  • @Jish我不懂你的意思.您可以使用任何哈希函数,将其结果转换为十六进制并取前两个十六进制数字.那么,理想情况下,两个数字的"[0-9a-f]"之间的分配相等. (3认同)

sar*_*old 8

如果服务器的文件系统已dir_index打开该功能(tune2fs(8)有关检查和打开该功能的详细信息,请参阅参考资料),那么在性能下降之前,您可以合理地在目录中存储超过100,000个文件.(dir_index多年来,对于大多数发行版来说,它一直是新文件系统的默认设置,所以它只是一个默认情况下没有打开该功能的文件系统.)

也就是说,添加另一个目录级别可以将目录中的文件数量减少16或256倍,这将极大地提高工作的可能性,ls *而不会超出内核的最大argv大小.

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

/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...
Run Code Online (Sandbox Code Playgroud)

即,根据您可以根据名称计算的某些功能,在路径前面添加一个字母或数字.(前两个字符md5sumsha1sum文件名是一种常用的方法,但是如果你有独特的对象ID,然后'a'+ id % 16是很容易的机制来确定要使用的目录.)


glg*_*lgl 6

60000也没什么,20000也是.但是你应该以任何方式将这些20000分组,以加快对它们的访问.也许在100或1000的组中,通过获取目录的数量并将其除以100,500,1000等等.

例如,我有一个文件有数字的项目.我把它们分成1000个,所以我有

id/1/1332
id/3/3256
id/12/12334
id/350/350934
Run Code Online (Sandbox Code Playgroud)

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

  • 等待......我们确实在这里 (4认同)
  • 等了几年,我们在那里...... :-) (2认同)