这与我在 StackOverflow 上发布的一个问题相关:
https://stackoverflow.com/questions/1200768/php-writing-large-amounts-of-files-to-one-directory
如果您阅读 Paul Alan Taylor 的回答中的评论,您就会明白我在说什么。
这是我的示例文件夹结构:
主文件夹包含 100,000 个子文件夹,每个子文件夹包含大约 20 个文件。我的问题是,如果文件位于其中一个子目录中,那么当我通过浏览器请求 Web 服务器上的文件时,是否会出现性能问题?
答案1
您遇到了一个众所周知的问题。虽然有些文件系统可以容纳数百万个文件(Linux 上的 XFS 和 ReiserFS,Windows 上的 NTFS),但它们仍然必须筛选文件名堆栈来搜索那个文件。仅仅因为它可以容纳那么多文件并不意味着它会很快。我曾在 Windows 服务器上请求文件属性,而服务器上只有数万个文件,这几乎就是“去吃午饭然后回来”的事情。我还尝试通过列出目录ls
,发现其中的 20,000 多个文件在繁忙的服务器上需要大约 2 分钟的处理时间(文件系统是 Ext3)。
幸运的是,有一个解决方案,尽管它可能与您的预期有些不同。
使用附加子目录。
这是一个众所周知的策略,已成功应用于各种项目。例如,乌贼用途出于同样的原因,使用多层子目录来处理完全相同的问题- 数十万个需要快速访问的文件。只需使用一层额外的目录,他们就可以管理百万容易地。
它在网页中也比你想象的更常见。每次你看到类似这样的 URL(加粗以强调):
http://www.somelargenewssite.com/articles/09/08/a4/gibberish-page-key-abc123.html
...它实现了同样的效果。它不是按年份和月份跟踪文章,而是提高客户端的页面加载性能减少网络服务器查找页面的时间。
如果可能的话,请避免每个目录有 100,000 个文件。尝试将目标定为 1,000 - 10,000。如果您不确定如何实现这一点,只需取文件的第一个字母并将其设为附加目录,即
http://mysite.com/subpage/abcdefg1234567.php
变成
http://mysite.com/subpage/a/abcdefg1234567.php
如果这不能减少您的文件数量,您可以取第二封信或第三封信等等,直到文件数量减少到可管理的大小。
http://mysite.com/subpage/a/b/c/abcdefg1234567.php
此过程需要您进行最少的编码,仅通过文件名就可以轻松实现,并且可以缩短您的访问时间无论您使用什么文件系统。
答案2
来自 Novell 网站:
克服 EXT3 文件系统 32000 个子目录的限制的另一种方法是将 EXT3 内核模块的目录 i 节点最大数量增加到 65500,然后从现有内核源重新编译并构建新内核。参考
话虽如此,使用数据库。
答案3
答案4
您需要说明您正在使用哪种文件系统。我读到过 ext3 最多有 32,000 个子目录,所以它根本行不通。
为什么有这么多子目录,也许你应该使用数据库?如果它们有很多小文件,这可能是可能的。
我认为正确的文件系统可能是次要考虑的问题。您可能想回到 stackoverflow 并查看最适合您正在做的事情的树结构(如果树是最好的)。然后尝试找到适合的文件系统或数据库。虽然同时考虑这些确实有意义,但您可能想首先弄清楚如此大数据集的计算机科学方面。