什么是更好的性能 - 一个目录中的许多文件,或每个有一个文件的许多子目录?

iol*_*leo 11 filesystems file

在构建Web应用程序时,我们经常会有与数据库条目相关联的文件,例如:我们有一个user表,每个类别都有一个avatar字段,该字段保存相关图像的路径.

为了确保文件名中没有冲突,我们可以:

  • 上传时重命名文件ID.jpg; 那条路就是/user-avatars/ID.jpg
  • 或为每个实体创建一个子目录,并保留原始文件名; 那条路就是/user-avatars/ID/original_filename.jpg

其中ID是users唯一的ID号

从应用程序逻辑的角度来看,两者都是完全有效的.

但从文件系统性能的角度来看哪一个会更好?我们必须记住,category条目的数量可能非常高(数百万).

目录可以容纳多个子目录是否有限制?

ale*_*tha 7

这将取决于你的文件系统,但我会假设你正在谈论像ext3这样简单的东西,你并没有运行分布式文件系统(其中一些非常擅长).通常,文件系统在单个目录中的一定数量的条目上表现不佳,无论这些条目是目录还是文件.因此,无论您是为每个映像创建一个目录还是在根目录中创建一个映像,都会遇到扩展问题.如果你看看这个答案:

目录中有多少文件太多(在Windows和Linux上)?

您将看到ext3在目录中的大约32K条目中遇到限制,远远低于您提议的条目.

在我的脑海中,我建议对多级目录树进行一些基本的分片,比如/user-avatars/1/2/12345/original_filename.jpg.(或者适合您的ID类型的东西,但我将您的问题解释为关于数字ID.)当您决定要在存储群集中分发时,这样做也会使您的生活更轻松,因为您可以传播目录周围.

  • 这样就行了......我会选择稍微宽一点的分支因子,比如123/456 /每个目录一千个文件.这意味着最大深度在2到3之间(10M的日志基础为1K),虽然对于文件系统仍然非常易于管理,并且仍然相当人性化,但是,上帝禁止,你需要实际查看内容. (3认同)