我刚刚为我的网站添加了一个预测搜索功能(见下面的示例),该功能在 Ubuntu Server 上运行。它直接从数据库运行。我想缓存每次搜索的结果,如果存在则使用它,否则创建它。
我将潜在的 cira 1000 万结果保存在一个目录中的单独文件中,这会有问题吗?还是建议将它们拆分到文件夹中?
例子:
答案1
如果我将大约 1000 万个结果保存在一个目录中的单独文件中,这会有什么问题吗?
是的。可能还有更多原因,但我能想到的有这些:
tune2fs
有一个选项dir_index
,默认情况下会启用(在 Ubuntu 上是启用的),它允许您在目录中存储大约 100k 个文件,然后才会看到性能下降。这甚至与您所考虑的 10m 个文件相差甚远。ext
文件系统具有固定的最大 inode 数量。每个文件和目录使用 1 个 inode。用于df -i
查看您的分区和 inode 是否可用。当 inode 用完时,您无法创建新文件或文件夹。rm
和等命令ls
在使用通配符时会扩展命令,最终会得到“参数列表太长”的结果。您必须使用find
来删除或列出文件。而且find
速度往往很慢。
或者建议将它们分成文件夹吗?
是的。绝对可以。基本上你甚至无法将 10m 个文件存储在 1 个目录中。
我会使用数据库。如果您想将其缓存到网站上,请查看“solr“(“提供分布式索引、复制和负载平衡查询”)。
答案2
最终还是出现了同样的问题。运行我自己的基准测试,看看是否可以将所有内容放在同一个文件夹中,而不是放在多个文件夹中。看来可以,而且速度更快!
答案3
二分查找可以轻松处理数百万条记录,因此搜索单个目录不是问题。它会非常快地完成搜索。
基本上,如果您使用的是 32 位系统,则二进制搜索最多 2Gb 记录既简单又好。
Berekely DB 是一款开源软件,它可以让您将完整的结果存储在一个条目下,并且内置有搜索功能。
答案4
这取决于你想用这 1000 万个文件做什么。如果你不需要对保存目录执行“列出”或“浏览”之类的操作,而只需要通过名称访问单个文件,并且可以明确地预测它们的名称,我认为将这么多文件存储在同一个目录中没有任何问题。
另一方面,请记住,大多数 UI 和 shell 都不是设计来有效地处理这种情况的,所以您知道不要使用rm *
而是ls | xargs rm
删除这里的所有内容。
请注意,Unix 风格文件系统(例如 ext4)中的 inode 数量与选择平面或分层目录结构没有直接关系,因为无论将文件放在哪个目录中,它都会占用 inode。实际上,更深的目录结构在 inode 消耗上的开销更高。(所以在我看来,接受的答案误导性地提到了 inode 限制,而这并不支持该论点。)