问候,
我正在编写一些脚本来处理来自各种照片网站的图像。现在,我将所有这些数据存储在同一目录中的单个文本文件中。
该目录可通过Web访问。最终用户调用Web服务,该服务将返回用户所需文件的路径。
我想知道在所有阶段将所有这些文件放在同一目录中会对性能产生影响吗?(如果有)
问候,
我正在编写一些脚本来处理来自各种照片网站的图像。现在,我将所有这些数据存储在同一目录中的单个文本文件中。
该目录可通过Web访问。最终用户调用Web服务,该服务将返回用户所需文件的路径。
我想知道在所有阶段将所有这些文件放在同一目录中会对性能产生影响吗?(如果有)
Answers:
性能因所使用的文件系统而异。
EXT3:物理限制为32,000个文件,但性能也受数千个文件的影响。
EXT4:理论上是无限的
ReiserFS,XFS,JFS,BTRFS:这些文件是目录中许多文件的好选择,因为它们更现代并且可以处理许多文件(其他文件是在HDD以MB而非GB计量的年代设计的) 。对于许多文件(以及ext4)来说,性能要好得多,因为它们都使用二进制搜索类型算法来获取所需的文件(其他文件则使用线性度更高的文件)。
我存储供Web服务器使用的图像,并且在EXT3的一个目录中有300,000张图像。我没有看到任何性能问题。在进行此设置之前,我对目录中的500k张图像进行了测试,并按名称随机访问了文件,并且目录中的10万张图像中有500k张以上的图像并没有明显的变慢。
我看到的唯一缺点是,为了与第二个服务器同步新服务器,我必须rsync
在整个目录上运行,而不能仅仅告诉它同步包含最近一千个左右的子目录。
文件夹中的文件数量理论上可能是无限的。但是,每次操作系统访问特定文件夹以搜索文件时,它都必须处理该文件夹中的所有文件。文件少于500个时,您可能不会注意到任何延迟。但是,当单个文件夹中有成千上万个文件时,简单的文件夹列表命令(ls或dir)可能会花费太长时间。当这些文件夹可以通过FTP访问时,它的速度确实会太慢...
性能问题并不真正取决于您的操作系统,而是取决于系统处理器的速度,磁盘容量和内存。如果有那么多文件,则可能需要将它们组合成一个存档,并使用经过优化的归档系统来保存大量数据。这可能是一个ZIP文件,但更好的是,将它们作为blob存储在数据库中,文件名作为主键。
ls
是有问题的。
正如@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/