【问题标题】:Many files in one directory?一个目录下有很多文件?
【发布时间】:2011-01-19 09:01:41
【问题描述】:

我在 Linux 平台上开发了一些 PHP 项目。将数千个图像(文件)放在一个目录中是否有任何缺点?这是一个不会增长的封闭集。另一种方法是使用基于某个 ID 的目录结构来分隔这些文件(这样我们就可以说一个目录中只有 100 个)。

我问这个问题,因为当我查看不同站点上的图像 URL 时,我经常会看到这种分离。您可以看到目录分离是以这样的方式完成的,一个目录中不超过数百张图像。

不将数千个文件(非增长集)放在一个目录中,而是将它们分成一组,例如100?值得把事情复杂化吗?

更新:

  • 不会对目录中的文件进行任何编程迭代(只是通过文件名直接访问图像)
  • 我想强调的是图像集是关闭的。不到 5000 张图片,仅此而已。
  • 此图像没有逻辑分类
  • 无需人工访问/浏览
  • 图像具有唯一的文件名
  • 操作系统:Debian/Linux 2.6.26-2-686,文件系统:ext3

来自答案的重要信息:

为什么要将许多文件分开到不同的目录:

  • “使用 ext3 over nfs 时每个目录限制 32k 个文件”
  • 性能原因(访问速度)[但是对于数千个文件,如果不进行衡量,很难说是否值得]

【问题讨论】:

    标签: php linux filesystems


    【解决方案1】:

    我认为这个问题有两个方面:

    1. 您正在使用的 Linux 文件系统是否有效地支持包含数千个文件的目录。我不是专家,但我认为较新的文件系统不会有问题。

    2. 特定 PHP 函数是否存在性能问题?我认为直接访问文件应该没问题,但如果你正在做目录列表,那么你最终可能会遇到时间或内​​存问题。

    【讨论】:

      【解决方案2】:

      通常这种拆分的原因是文件系统性能。 对于一组封闭的 5000 个文件,我不确定这是否值得。 我建议您尝试将所有文​​件放在一个目录中的简单方法,但请注意访问文件所需的实际时间。

      如果您发现它的速度不足以满足您的需求,您可以按照您的建议进行拆分。

      出于性能原因,我不得不自己拆分文件。 此外,在 nfs 上使用 ext3 时,我遇到了每个目录 32k 文件的限制(不确定是 nfs 还是 ext3 的限制)。 所以这是拆分为多个目录的另一个原因。 无论如何,请尝试使用单个目录,并且仅在您发现它不够快时才拆分。

      【讨论】:

      • (not sure if it's a limit of nfs or ext3) 这是一个 ext3 限制。
      【解决方案3】:

      如果可以选择更改文件系统,我建议您将存储所有图像的任何位置移动到 ReiserFS 文件系统。它非常适合快速存储/访问大量小文件。

      如果没有,MightyE 将它们分成文件夹的反应是最合乎逻辑的,并且会大大增加访问时间。

      【讨论】:

        【解决方案4】:

        如果您不希望任何文件名冲突并且您不需要在任何时候迭代这些图像,则没有理由将这些文件拆分到多个目录中。

        但是,如果您能想到一个暗示性的分类,那么对图像进行一点排序也不错,即使只是出于维护原因。

        【讨论】:

          【解决方案5】:

          几千张图片还是可以的。当您访问目录时,操作系统会按 4K 块读取其文件列表。如果您有简单的目录结构,如果其中有很多(例如十万个)文件,则可能需要一些时间来读取整个文件列表。

          【讨论】:

            【解决方案6】:

            除了通过将图像分成子目录来加快文件访问速度之外,您还可以在达到文件系统的自然限制之前显着扩展可以跟踪的文件数量。

            一个简单的方法是md5() 文件名,然后使用前n 个字符作为目录名(例如,substr(md5($filename), 2))。这确保了合理均匀的分布(与直接文件名的前 n 个字符相比)。

            【讨论】:

            • 多于一个级别将有助于进一步级别的子目录。例如:./12/34/56/78/1234567890abc.jpg.
            • 好的,所以 md5 将是一种通用方法。就我而言,我已经有了唯一的 ID,因为每个图像都与一个数据库行相关联(当然它是主行)。我认为这是一个典型的场景。
            • 值得考虑的是,这些数字可能不像 md5 哈希那样均匀分布。
            • 感谢您的回答(也感谢您提出这样的问题)。这对我很有帮助。我在一个目录中生成 html 缓存,但最后有很多文件。所以我用substr(md5($filename), 2) 在目录上拆分了一代,现在它运行起来就像一个魅力。
            【解决方案7】:

            我能想象它会在哪里有害的唯一原因是迭代目录时。更多的文件,意味着更多的迭代。但从编程的角度来看,我能想到的基本上就是这些了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-07
              • 2013-12-31
              • 2013-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多