Cod*_*oso 48 linux directory directory-structure
我正在开发一个LAMP在线商店,它将允许管理员为每个项目上传多个图像.
我担心的是 - 马上就会有20000个项目,意味着大约60000张图像.
问题:
Linux上的文件和/或文件夹的最大数量是多少?
处理这种情况的常用方法是什么(最佳实践)?
我的想法是根据每个项目的唯一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),在大型目录中查找并不是什么大问题.但请注意,许多管理工具(例如ls或rm)可能很难处理包含太多文件的目录.因此,建议将文件拆分,以便在任何给定目录中没有超过几百到一千个项目.一种简单的方法是散列您正在使用的任何ID,并使用前几个十六进制数字作为中间目录.
例如,假设您有项目ID 12345,并且它具有哈希值'DEADBEEF02842.......'.您可以将文件存储在/storage/root/d/e/12345.您现在已将每个目录中的文件数减少了1/256.
如果服务器的文件系统已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)
即,根据您可以根据名称计算的某些功能,在路径前面添加一个字母或数字.(前两个字符md5sum或sha1sum文件名是一种常用的方法,但是如果你有独特的对象ID,然后'a'+ id % 16是很容易的机制来确定要使用的目录.)
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.