将许多(1000 万个)文件放在一个文件夹中

将许多(1000 万个)文件放在一个文件夹中

我刚刚为我的网站添加了一个预测搜索功能(见下面的示例),该功能在 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

最终还是出现了同样的问题。运行我自己的基准测试,看看是否可以将所有内容放在同一个文件夹中,而不是放在多个文件夹中。看来可以,而且速度更快!

基准

参考:https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

答案3

二分查找可以轻松处理数百万条记录,因此搜索单个目录不是问题。它会非常快地完成搜索。

基本上,如果您使用的是 32 位系统,则二进制搜索最多 2Gb 记录既简单又好。

Berekely DB 是一款开源软件,它可以让您将完整的结果存储在一个条目下,并且内置有搜索功能。

答案4

这取决于你想用这 1000 万个文件做什么。如果你不需要对保存目录执行“列出”或“浏览”之类的操作,而只需要通过名称访问单个文件,并且可以明确地预测它们的名称,我认为将这么多文件存储在同一个目录中没有任何问题。

另一方面,请记住,大多数 UI 和 shell 都不是设计来有效地处理这种情况的,所以您知道不要使用rm *而是ls | xargs rm删除这里的所有内容。

请注意,Unix 风格文件系统(例如 ext4)中的 inode 数量与选择平面或分层目录结构没有直接关系,因为无论将文件放在哪个目录中,它都会占用 inode。实际上,更深的目录结构在 inode 消耗上的开销更高。(所以在我看来,接受的答案误导性地提到了 inode 限制,而这并不支持该论点。)

相关内容