1

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

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

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

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

4

2 回答 2

1

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

于 2012-10-09T08:26:45.157 回答
1

经典的答案总是:大目录会降低您的性能。

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

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

通常,当目录中的文件数量增加时,您应该期望对数增长。除非您使用极其脑残的文件系统,例如 FAT32 或配置混乱。但是,当使用大量目录或目录层次结构时,您也可以预期渐近相同的增长。

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

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

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

在文件数量较少但有另一层目录的目录中打开文件:

  • 遍历文件系统以查找父目录 inode。即使这样也可能使用多个 IO,但缓存有帮助
  • 读取父目录inode
  • 查找子目录的目录条目。同样,对数,但可能比替代方案少 IO。
  • 读取目录inode
  • 查找文件本身的目录条目。同样,对数,但可能比替代方案少 IO。
  • 读取文件 inode
  • 读取文件数据

Asymptotically, it is not buying you anything for reading/writing data to split it up into a large number of directories.

[Edit:] W.r.t the proposal to build a directory hierarchy per letter of the word. This means you have a branching factor of at most 52, and probably a large skew in the file distribution. Some letters are more common and the directories contain much more files. The branching factor when using the implicit tree structure the file system, e.g. will be higher and the distribution will not be skewed. This significantly reduces the IOs. This is simply a bad idea when aiming for performance. If somebody really wants to do use a directory please, please consider hashing the data to directories to at least ensure a good data distribution.

于 2012-10-12T09:37:15.277 回答