【问题标题】:1 million or more files in one folder, for include (cache) [closed]一个文件夹中有 100 万个或更多文件,用于包含(缓存)[关闭]
【发布时间】:2012-08-08 22:38:42
【问题描述】:

我有一个“理论”问题,看看我计划的解决方案是否有意义:

我有一个脚本,它可以从数据库中读取大量数据,包括设置、配置等 - 并构建这些数据(针对每个注册用户)。我不会详细说明为什么或究竟是什么。

我的想法是,我实际上只能这样做一次,然后创建一个带有用户 ID 的 .inc 文件来缓存它。如果用户更改某些内容,当然会重新创建文件。

但是现在,假设我这样做了,有 1'000'000 - 甚至更多的文件。在包含这些文件时,我会遇到问题吗? (总是一个特定的文件,而不是一次每个文件)。这通常是个好主意,还是我只是用这个来给服务器更多压力?

我打算将所有内容都放在同一个缓存文件夹中 - 如果我将该文件夹拆分为多个文件夹,性能会有所提高吗?

感谢您的帮助。

【问题讨论】:

  • 我强烈怀疑文件读取时间,尤其是在制作一百万个文件时,会比仅读取数据库的时间少。
  • 读取时间不会少,但实际上我必须读取数据库并根据结果计算一些东西。我基本上将“结果”保存为缓存文件(这样就不必每次都执行(检索、分析、计算)它)
  • 为什么不将这些“结果”存储在数据库的额外字段中?但除非您进行繁重而广泛的计算,否则没有必要这样做。
  • 这确实是 SU/SF 的问题,因为它更多的是关于底层文件系统(NTFS、ext3/ext4 和 XFS 是您在现实世界中最常见的) 将处理它而不是其他任何事情。我的直觉告诉我,一个目录的根目录中有 1000000 个文件是一个糟糕的计划。
  • 好问题 - 我认为不在数据库中存储这些东西会更好(+ 少一个数据库调用),看到最终结果实际上通常也包含一些代码(自动生成的代码)而且我真的不想eval() 它,因为afaik,include 使用缓存机制,对吗? - 我在寻找其他解决方案,为什么他们倾向于使用缓存文件?我只是不确定这种类型的原始信息是否属于数据库

标签: php performance file-io include


【解决方案1】:

您将受到文件系统的限制。不可能在一个文件夹中访问那么多文件。你可以这样做:

  1. 散列文件名:file1.php 变为 3305d5836bea089f2a1758d8e89848c8
  2. 将哈希分成几部分:3/3/0/5/d/5836bea089f2a1758d8e89848c8
  3. 完成了

【讨论】:

  • 如果/当我要组织一百万个文件时,我肯定会使用这种方法。我是否认为它会减少由于嵌套文件夹结构导致的 I/O 延迟?
  • 谢谢,这将是我最喜欢的解决方案。但是我开始担心会走错路……
【解决方案2】:

某些文件系统不允许这样做,并且在许多文件系统上会非常慢 - 一个文件的简单查找将非常慢,以至于您的程序将一直在寻找磁盘,而几乎不消耗 CPU。如果您拆分这些文件,这样每个文件夹中的文件数不会超过数千个,您的情况会好得多。

还有see this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多