问候,
我正在编写一些脚本来处理来自各种照片网站的图像。 现在我将所有这些数据存储在同一目录中的单个文本文件中。
该目录是networking访问。 最终用户调用Web服务,该服务将path返回到用户需要的文件。
我想知道在什么阶段,我将所有这些文件放在同一个目录下,从而使性能受到影响? (如果有的话)
性能因您使用的文件系统而异。
EXT3:物理限制是3.2万个文件,但是perf也会在几千个文件之后受损。
EXT4: 理论上无限
ReiserFS,XFS,JFS,BTRFS:这些对于目录中的大量文件来说是很好的select,因为它们更加现代化,可以处理很多文件(其他的都是在硬盘以MB或GB为单位进行测量的时候devise的) 。 对于许多文件(以及ext4),性能要好得多,因为它们都使用二进制searchtypesalgorithm来获取所需的文件(其他文件使用更为线性的文件)。
我存储的图像服务的Web服务器,我有超过30万的图像在EXT3上的一个目录。 我看不到任何性能问题。 在设置之前,我在一个目录中做了500k个图像的testing,并且通过名称随机地访问文件,并且在目录中的10k图像上没有显着减速。
我看到唯一的缺点是,为了与第二个服务器同步新的,我必须在整个目录上运行rsync ,不能告诉它同步包含最近的几千个左右的子目录。
文件夹中的文件数量理论上可以是无限的。 但是,每当操作系统访问特定文件夹来search文件时,都必须处理文件夹中的所有文件。 less于500个文件,你可能不会注意到任何延迟。 但是,如果单个文件夹中有数以万计的文件,则简单的文件夹列表命令(ls或dir)可能会耗费太长时间。 当这些文件夹可以通过FTP访问,它会真的太慢…
性能问题不会取决于您的操作系统,而取决于您的系统处理器速度,磁盘容量和内存。 如果有多个文件,则可能需要将它们合并到一个归档中,并使用经过优化的归档系统来保存大量数据。 这可能是一个ZIP文件,但更好,将它们作为blob存储在数据库中,文件名为主键。
我的经验法则是如果有超过1000个文件,文件夹将被浏览(即通过互联网或资源pipe理器)或5000文件,否则拆分文件夹。
正如@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/
如果您直接访问文件,则目录中的文件数量不存在速度问题。
您可以在单个目录中创build的文件数量取决于您使用的文件系统。 如果列出目录中的所有文件或search,sorting等有许多文件将放慢这些操作。
gbjbaanb在关于ext3的最大文件大小的回答中是错误的。 一般来说,ext限制了光盘上文件的数量。 你不能创build更多的文件,然后你的inode表中有索引节点。 他build议使用reiserfs来获得更多的文件性能
在NTFS中检查10K文件的文件夹(Windows 7,64位)。 在任何视图(列表,图标等)中都有10K图像的文件夹可以正常工作,并且无需任何明显的延迟就可以滚动。