Filesystems 我可以在一个目录中放置多少文件?

Filesystems 我可以在一个目录中放置多少文件?,filesystems,limit,Filesystems,Limit,我在一个目录中保存多少文件重要吗?如果是,一个目录中有多少文件太多,文件太多的影响是什么?(这是在Linux服务器上。) 背景:我有一个相册网站,上传的每一张图片都被重命名为8个十六进制数字的id(比如a58f375c.jpg)。这是为了避免文件名冲突(例如,如果上载了大量“img001.JPG”文件)。原始文件名和任何有用的元数据都存储在数据库中。现在,我在images目录中大约有1500个文件。这使得列出目录中的文件(通过FTP或SSH客户端)需要几秒钟的时间。但我看不出除此之外还有什么效果

我在一个目录中保存多少文件重要吗?如果是,一个目录中有多少文件太多,文件太多的影响是什么?(这是在Linux服务器上。)

背景:我有一个相册网站,上传的每一张图片都被重命名为8个十六进制数字的id(比如a58f375c.jpg)。这是为了避免文件名冲突(例如,如果上载了大量“img001.JPG”文件)。原始文件名和任何有用的元数据都存储在数据库中。现在,我在images目录中大约有1500个文件。这使得列出目录中的文件(通过FTP或SSH客户端)需要几秒钟的时间。但我看不出除此之外还有什么效果。特别是,似乎对图像文件提供给用户的速度没有任何影响


我考虑过通过创建16个子目录来减少图像的数量:0-9和a-f。然后根据文件名的第一个十六进制数字将图像移动到子目录中。但除了偶尔通过FTP/SSH列出目录外,我不确定是否有任何理由这样做。

我遇到的最大问题是在32位系统上。一旦超过某个数字,像“ls”这样的工具就会停止工作


一旦您通过了该障碍,尝试对该目录执行任何操作都将成为一个巨大的问题。

问题归结为您将如何处理这些文件

在Windows下,任何包含超过2k个文件的目录在资源管理器中打开的速度都比较慢。如果它们都是图像文件,那么在缩略图视图中,超过1k的文件往往打开得非常慢


曾经,系统施加的限制是32767。它现在更高了,但在大多数情况下,一次处理的文件太多了。

这取决于Linux服务器上使用的特定文件系统。现在默认的是带有dir_索引的ext3,这使得搜索大目录非常快

因此,速度不应该是一个问题,除了你已经注意到的一个问题,那就是列表将需要更长的时间


一个目录中的文件总数有限制。我似乎记得它肯定能处理32000个文件

这实际上取决于所使用的文件系统,以及一些标志

例如,可以有数千个文件;但在几千年后,它曾经非常缓慢。通常在列出目录时,也在打开单个文件时。几年前,它获得了“htree”选项,这大大缩短了获得给定文件名的inode所需的时间


就我个人而言,我使用子目录将大多数级别保持在1000个左右的项目之下。在您的情况下,我将创建256个目录,其中包含ID的最后两个十六进制数字。请使用最后一个数字,而不是第一个数字,这样可以实现负载平衡。

我记得运行过一个程序,该程序在输出端创建了大量文件。这些文件按每个目录30000个进行排序。我不记得在我不得不重用生成的输出时有任何读取问题。它安装在32位Ubuntu Linux笔记本电脑上,甚至还显示了目录内容,尽管只需几秒钟

ext3文件系统:64位系统上的类似代码很好地处理了每个目录64000个文件。

  • 最大文件数:268173300
  • 每个目录的最大文件数:216-1(65535)
  • 最大文件大小:不带的2GiB-1,带的4GiB-1
:
  • 最大文件数:232-1(4294967295)
  • 最大文件大小
    • 实现:244-26字节(16TiB-64KiB)
    • 理论:264-26字节(16EiB-64KiB)
  • 最大卷大小
    • 实现:232-1集群(256TiB-64KiB)
    • 理论:264-1簇(1YiB-64 KiB)
:
  • 最大文件数:1018
  • 每个目录的最大文件数:~1.3×1020(性能问题超过10000个)
  • 最大文件大小
    • 16GiB(块大小为1KiB)
    • 256GiB(块大小为2KiB)
    • 2TB(块大小为4KB)
    • 2TB(块大小为8KiB)
  • 最大卷大小
    • 4TB(块大小为1KB)
    • 8TiB(块大小为2KiB)
    • 16TiB(块大小为4KB)
    • 32TiB(块大小为8KiB)
:
  • 最大文件数:min(volumeSize/213,numberOfBlocks)
  • 最大文件大小:与ext2相同
  • 最大卷大小:与ext2相同
:
  • 最大文件数:232-1(4294967295)
  • 每个目录的最大文件数:无限制
  • 最大文件大小:244-1字节(16TiB-1)
  • 最大卷大小:248-1字节(256TB-1)

如果实现目录分区方案所需的时间很短,我会支持它。第一次调试涉及通过控制台操作10000个文件目录的问题时,您会理解


例如,F-Spot将照片文件存储为YYYY\MM\DD\filename.ext,这意味着我在手动操作我的~20000张照片集合时必须处理的最大目录约为800个文件。这也使得文件更容易从第三方应用程序浏览。永远不要假设您的软件是访问软件文件的唯一对象。

请记住,在Linux上,如果目录中有太多文件,shell可能无法扩展通配符。我在Linux上托管的相册中遇到了这个问题。它将所有调整大小的图像存储在一个目录中。虽然文件系统可以处理许多文件,但shell不能。例如:

-shell-3.00$ ls A*
-shell: /bin/ls: Argument list too long


这完全取决于文件系统。许多现代文件系统使用合适的数据结构来存储目录的内容,但较旧的文件系统通常只是将条目添加到列表中,因此检索文件是一个O(n)操作

即使文件系统做得很好,对于程序来说也是绝对可能的
-shell-3.00$ chmod 644 *jpg
-shell: /bin/chmod: Argument list too long
..../45/67/1234567_<...>.jpg
function dynamic_path($int) {
    // 1000 = 1000 files per dir
    // 10000 = 10000 files per dir
    // 2 = 100 dirs per dir
    // 3 = 1000 dirs per dir
    return implode('/', str_split(intval($int / 1000), 2)) . '/';
}
function dynamic_path2($str) {
    // 26 alpha + 10 num + 3 special chars (._-) = 39 combinations
    // -1 = 39^2 = 1521 files per dir
    // -2 = 39^3 = 59319 files per dir (if every combination exists)
    $left = substr($str, 0, -1);
    return implode('/', str_split($left ? $left : $str[0], 2)) . '/';
}
<?php
$files = explode(',', '1.jpg,12.jpg,123.jpg,999.jpg,1000.jpg,1234.jpg,1999.jpg,2000.jpg,12345.jpg,123456.jpg,1234567.jpg,12345678.jpg,123456789.jpg');
foreach ($files as $file) {
    echo dynamic_path(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>

1/1.jpg
1/12.jpg
1/123.jpg
1/999.jpg
1/1000.jpg
2/1234.jpg
2/1999.jpg
2/2000.jpg
13/12345.jpg
12/4/123456.jpg
12/35/1234567.jpg
12/34/6/12345678.jpg
12/34/57/123456789.jpg

<?php
$files = array_merge($files, explode(',', 'a.jpg,b.jpg,ab.jpg,abc.jpg,ddd.jpg,af_ff.jpg,abcd.jpg,akkk.jpg,bf.ff.jpg,abc-de.jpg,abcdef.jpg,abcdefg.jpg,abcdefgh.jpg,abcdefghi.jpg'));
foreach ($files as $file) {
    echo dynamic_path2(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>

1/1.jpg
1/12.jpg
12/123.jpg
99/999.jpg
10/0/1000.jpg
12/3/1234.jpg
19/9/1999.jpg
20/0/2000.jpg
12/34/12345.jpg
12/34/5/123456.jpg
12/34/56/1234567.jpg
12/34/56/7/12345678.jpg
12/34/56/78/123456789.jpg
a/a.jpg
b/b.jpg
a/ab.jpg
ab/abc.jpg
dd/ddd.jpg
af/_f/af_ff.jpg
ab/c/abcd.jpg
ak/k/akkk.jpg
bf/.f/bf.ff.jpg
ab/c-/d/abc-de.jpg
ab/cd/e/abcdef.jpg
ab/cd/ef/abcdefg.jpg
ab/cd/ef/g/abcdefgh.jpg
ab/cd/ef/gh/abcdefghi.jpg