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


17

我刚刚在运行于Ubuntu Server的网站上添加了预测搜索功能(请参见下面的示例)。这直接从数据库运行。我想为每个搜索缓存结果,并使用它(如果存在),否则创建它。

将一个潜在的1000万cira结果保存到一个目录中的单独文件中,是否会有任何问题?还是建议将它们分成文件夹?

例:


5
最好拆分。任何试图列出该目录内容的命令都可能决定自行射击。
muru 2015年

8
因此,如果您已经有一个数据库,为什么不使用它呢?我敢肯定,与文件系统相比,DBMS将能够更好地处理数百万条记录。如果您对使用文件系统一无所知,则需要提出一种使用某种哈希的拆分方案,这时恕我直言,听起来使用数据库的工作量会减少。
roadmr'2

3
缓存更适合您的模型的另一种选择可能是内存缓存或Redis。它们是键值存储(因此它们的作用类似于单个目录,您只需按名称即可访问项目)。Redis是持久性的(重启后不会丢失数据),其中memcached用于存储更多临时项。
史蒂芬·奥斯特米勒

2
这里有个鸡和蛋的问题。工具开发人员不会处理包含大量文件的目录,因为人们不会这样做。而且人们不会使用大量文件创建目录,因为工具不能很好地支持它。例如,我一次理解(并且我相信这仍然是正确的),os.listdir出于这个原因,一个功能请求在python中生成生成器版本被完全拒绝。

根据我自己的经验,在Linux 2.6的单个目录中处理超过32k文件时,我已经看到损坏。当然可以进行调整,但我不建议这样做。只需分成几层子目录,它将更好。我个人将其限制为每个目录10,000个左右,这将为您提供2层。
Wolph

Answers:


25

将一个潜在的大约一千万个结果保存在一个目录中的单独文件中,是否会有任何问题?

是。可能还有更多原因,但我可以将这些理由从头顶上张贴出来:

  • tune2fs有一个名为的选项dir_index,该选项通常默认情况下处于打开状态(在Ubuntu上是),该选项可让您在看到性能下降之前在目录中存储大约10万个文件。这甚至与您正在考虑的1000万个文件还差得很远。

  • ext文件系统具有固定的最大索引节点数。每个文件和目录使用1个索引节点。使用df -i您的分区和空闲inode的景色。当索引节点用尽时,您将无法创建新文件或文件夹。

  • 类似这样的命令rmls在使用通配符展开命令,将结束与一个“参数列表太长”。您将不得不使用find删除或列出文件。并且find往往很慢。

还是建议将它们分成文件夹?

是。明确地。基本上,您甚至不能在1个目录中存储10m个文件。

我会使用数据库。如果要为网站缓存它,请查看“ solr ”(“提供分布式索引,复制和负载平衡查询”)。


8

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

基准测试

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


1
谢谢,这非常有用。我在网站上使用它,将这部分重新编程为具有/abc/efg.html目录结构是一个真正的问题。因此,将来我将移回固定目录。
Kohjah Breese '18

0

二进制搜索可以轻松处理数百万条记录,因此搜索单个目录将不是问题。它将很快完成。

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

Berekely DB是一种开源软件,可以轻松地将完整结果存储在一个条目下,并且内置了搜索功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.