目录中有多少个文件太多?(从网络下载数据)

目录中有多少个文件太多?(从网络下载数据)

问候,

我正在编写一些脚本来处理来自各个照片网站的图片。目前,我将所有这些数据都存储在同一个目录中的单个文本文件中。

该目录可通过 Web 访问。最终用户调用 Web 服务,该服务将返回用户所需文件的路径。

我想知道在什么阶段将所有这些文件放在同一目录中会对性能产生影响?(如果有的话)

答案1

性能根据您使用的文件系统而变化。

  • FAT:忘掉它吧:)(好吧,我认为每个目录的限制是 512 个文件)
  • NTFS:尽管每个文件夹可以容纳 40 亿个文件,但其性能下降得相对较快 - 大约一千个文件后您就会开始注意到性能问题,几千个文件后您会看到资源管理器似乎挂起了很长一段时间。
  • EXT3:物理限制是 32,000 个文件,但是几千个文件之后性能也会受到影响。

  • 外部4:理论上无限

  • ReiserFS、XFS、JFS、BTRFS:这些文件系统适合存放目录中的大量文件,因为它们更现代,设计用于处理大量文件(其他文件系统的设计年代是硬盘以 MB 而不是 GB 为单位的时代)。对于存放大量文件,它们的性能要好得多(以及 ext4),因为它们都使用二进制搜索类型的算法来获取所需的文件(其他文件系统使用更线性的算法)。

答案2

我存储图片以供网络服务器使用,EXT3 上的一个目录中有超过 300,000 张图片。我没有发现任何性能问题。在设置之前,我使用目录中的 500k 张图片进行了测试,并按名称随机访问文件,目录中 500k 超过 10k 张图片时没有出现明显的速度下降。

我看到的唯一缺点是,为了将新的与第二个服务器同步,我必须运行rsync整个目录,而不能只告诉它同步包含最近一千个左右的子目录。

答案3

理论上,文件夹中的文件数量是无限的。但是,每次操作系统访问特定文件夹以搜索文件时,它都必须处理文件夹中的所有文件。如果文件少于 500 个,您可能不会注意到任何延迟。但是,当单个文件夹中有数万个文件时,简单的文件夹列表命令(ls 或 dir)可能会花费太长时间。当可以通过 FTP 访问这些文件夹时,它确实太慢了……

性能问题实际上并不取决于您的操作系统,而是取决于您的系统处理器速度、磁盘容量和内存。如果您有那么多文件,您可能希望将它们合并到一个存档中,并使用经过优化以保存大量数据的存档系统。这可能是一个 ZIP 文件,但更好的是,将它们作为 blob 存储在数据库中,并以文件名作为主键。

答案4

正如 @skaffman 指出的那样,限制取决于操作系统。您可能会受到旧操作系统的限制的影响。我记得旧版本的 Solaris 限制每个目录最多 32768 个文件。

通常的解决方案是使用某种散列,即 Cyrus imap 服务器通过字母散列来划分用户:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/

相关内容