创建大量目录,每个目录包含少量文件,或者包含大量文件的目录较少?

时间:2012-10-09 08:21:22

标签: php filesystems centos storage directory

我必须存储和管理与设计主题相关的大量信息。它可以通过两种可能的方式进行逻辑组织:

  1. 每个网站用户的目录,主题相关文件存储在此目录中。 (每个目录的文件不多)。

  2. 每个主题的目录,包含所有相关用户'这个文件。 (许多主题和许多用户)。

  3. 每次用户登录时,都必须提取相关文件。 我的网站是用PHP开发的,托管在CentOS上。这个问题是一个重要的设计问题吗?这两种选择会对存储和性能产生影响吗? 就个人而言,我觉得第一选择会更容易理解。

2 个答案:

答案 0 :(得分:1)

大型目录一旦包含太多文件就会有很大的开销(并且“太多”的定义是操作系统和文件系统相关的;所以通常你会更好地使用更多的目录(甚至嵌套在子目录中)每个文件中的文件较少...我通常会尝试使用100个文件/目录作为上限

答案 1 :(得分:1)

经典答案总是:大型目录会降低你的表现。

但是,我们 2012 。 80年代或90年代的答案不一定是一个好的答案。

Here是一个很好的微基准测试,在LevelDB系统的上下文中完成。 在使用ext3的基准测试中,在一个包含1000个文件的目录中打开文件需要9ms,在10,000个文件中打开10ms,在100,000个文件中打开16ms。 但请记住,阅读和打开额外的目录也需要一些时间。

通常,当目录中的文件数量增加时,您应该期望对数增长。除非你使用极其脑死亡的文件系统,例如FAT32或配置搞砸了。 但是,当使用大量目录或目录层次结构时,您也可以渐进地获得相同的增长。

作为比较,这是一般过程:

在包含大量文件的目录中打开文件:

  • 通过文件系统爬网查找目录inode。即使这可能使用多个IO,但缓存有帮助
  • 读取目录inode
  • 查找文件的目录条目。每个现代文件系统以某种形式的树结构组织目录的目录条目,例如,甚至ext3默认使用H-Tree大约6年左右。在较大的目录中,这需要采用对数步数,具有较大的分支因子。
  • 读取文件inode
  • 读取文件数据

在包含少量文件的目录中打开文件,但使用另一层目录:

  • 通过文件系统爬网查找父目录inode。即使这可能使用多个IO,但缓存有帮助
  • 读取父目录inode
  • 查找子目录的目录条目。再次,对数,但可能是IO少于替代。
  • 读取目录inode
  • 找到文件本身的目录条目。再次,对数,但可能是IO少于替代。
  • 读取文件inode
  • 读取文件数据

渐近地,它不会为了读取/写入数据而将任何东西分给大量目录。

[编辑:] W.r.t建议每个字母的字母构建一个目录层次结构。这意味着您的分支因子最多为52,并且可能是文件分布中的大偏差。有些字母更常见,目录包含更多文件。当使用隐式树结构时文件系统的分支因子,例如,将更高,分布不会扭曲。这显着降低了IO。在瞄准性能时,这简直是个坏主意。如果有人真的想要使用目录,请考虑将数据散列到目录,以至少确保良好的数据分发。