将文件存储在目录中…是否有限制?

我正在使用Plesk 9(64位)的CentOS 5,我正在运行一个网站,用户将上传图片。 对于64位的操作系统,有多less文件可以存储的限制? 我只关心性能,并提供文件。 我宁愿不要有4个分散的文件深的目录。 不过,我希望,在某个时候,我可以有200 – 30万的图像。

如果您使用ext3 ,我发现这个报价 (警告:西class牙语的发言网站)

“在一个目录中有32k(32768)个子目录的限制,这个限制可能只有学术兴趣,因为许多人甚至没有那么多的文件(尽pipe巨大的邮件服务器可能需要记住)。 ext2 inode规范允许超过100万亿个文件驻留在一个目录中“

进一步阅读表明,ext3 没有 32K的限制,这可以用经validation明

a=0; i=1; while [ $a == 0 ]; do touch $i; a=$?; let i++; done 

但它确实有一个32K的文件夹限制,可以用来testing

 a=0; i=1; while [ $a == 0 ]; do mkdir $i; a=$?; let i++; done 

这(没有根据)的说法说

ReiserFS在单个目录中的成千上万个文件中完全没有问题。 flabdablet – 2007年2月1日

从姊妹网站stackoverflow.com 这个问题也可以帮助。

一般来说:

  • 目录数量有限制,
  • 应该保持你的文件/目录低于32K,但可以进一步进一步,
  • 您正在使用的文件系统很重要。

这很大程度上取决于您使用的文件系统。 某些旧版本的ext3对此非常残酷,这就是btree的出现。 Reiser的性能比以前大得多。 在过去的一段时间里,我在NetWare服务器上安装了一个Novell NSS目录,由于GroupWise flub,它有250,000个4kb的文件,工作得很好。 枚举目录吸引了很多,但访问该目录中的特定文件的工作速度如你所愿。 因为这是8年前,我必须假设现代Linux文件系统能够处理这个问题。

这取决于您正在使用的文件系统,而不是操作系统的64位。 对于每个文件系统,都会出现某种程度的问题,即用于search目录的algorithm的大O成本将会越来越好。

如果您可以将文件分层结构分解成两层(2)层,则您将看到更好的长期可扩展性。

Linux中的文件系统存储目录基本上有两种:

  1. 作为文件的平面列表。

  2. 作为数据结构(通常是一个B +树或相关的数据结构)。

前者随着文件的添加逐渐变慢。 后者不。 请注意,ls可能仍然是永久的,因为它必须查找所有这些文件的索引节点,目录条目只包含文件名和inode编号。

Ext3目录是平坦的列表,带有散列树索引的选项可以加快速度。

XFS使用B +树。

但是对于这些文件系统中的任何一个,如果你做了一个ls -l,它将需要打击与文件一样多的inode。 对于名称查找(例如打开一个文件时)B +树和类似的东西将大大快速的目录。

目录的层次结构使pipe理文件变得更容易,所以你可能要考虑这种可能性。 即使是一个单层的目录,比如4000个文件,每个目录都会限制pipe理。

如果你要超过几百张图片,那么一定要考虑两件事情:

  1. 散列文件名的嵌套层次结构;
  2. 不使用ext3

我build议使用XFS,否则,ReiserFS将具有两层或三层目录层次结构,由两个字节对组成。 例如

 11/2f/112f667c786eac323e300632b5b2a78d.jpg 49/2f/49ef6eb6169cc57d95218c842d3dee5c.jpg 0a/26/0a26f9f363f1d05b94ceb14ff5f27284.jpg 

这将给你在前几个级别的256个目录,分割总共65535个单独的目录(这是足够的100 – 200K图像和以上)的图像。 它将使事情变得更快,更具可扩展性,并且使后续维护变得更容易。

ext3的大多数默认configuration都有一个限制, 每个目录32K子目录 (现在不能记住实际的数字,但几个星期前系统在Debian / Etch的时候遇到了这个问题)。

在一些使用大量caching的应用程序中也可能击中你。

考虑不要使用ext3,当然。 http://kernelnewbies.org/Ext4#head-97cbed179e6bcc48e47e645e06b95205ea832a68 (在ext4中显示新的function)可能是一个有用的启动点。

会说看看squid如何组织它的caching太多(多层目录)一个目录中的许多文件可能难以维护。 长列表(通常)吸。

ext3文件系统默认情况下在大多数发行版中都有大目录。 做一个tune2fs -l /dev/sda1 (或者你正在使用的任何blockdevice)并且检查“Filesystem features:”行。 如果其中有一个“dir_index”,那你就是金。

但是请注意,即使是最好的目录结构也只能使其快速find一个特定的文件。 在一个巨大的目录上执行ls会变得很糟糕,就像任何模式匹配一​​样,即使你知道它匹配单个文件。

由于这些原因,通常最好添加一个或两个级别的目录。 通常使用一些ID来命名目录。

它将取决于你在Linux服务器上使用的文件系统。

假设你用dir_index使用ext3,你应该能够很快地search大目录,所以速度不应该成为一个问题。 清单(显然)将需要更长的时间。

至于可以放在目录中的文件的最大数量,我敢肯定你可以可靠地工作多达32,000个文件。 我不确定我想要超过那个(即使你可能)。