快速访问文件

时间:2011-09-20 18:36:25

标签: php linux

我目前正在构建一个可以生成大量图像的应用程序(几万个图像,可能更多,但至少在不久的将来不会)。我希望能够确定文件是否存在,并通过http将其发送给客户端(我使用的是apache是​​我的Web服务器)。

最好的方法是什么?我想过将图像分割成几个文件夹并减少每个目录中的文件数量。例如,假设我决定每个文件名都以abc中较低的字母开头。比我创建26个目录,当我想要查找文件时,我将首先添加目录的名称。例如,如果我想要一个名为“funnyimage2.jpg”的文件,我会将其保存在名为“f”的目录中。如果需要,我可以为该结构添加图层。

老实说,我甚至不确定是否只保存一个目录中的所有文件并不是那么好,所以如果您可以添加解释为什么您的解决方案更好,那将非常有用。

P.S 我的应用程序是用PHP编写的,我打算使用file_exists来检查文件是否存在。

6 个答案:

答案 0 :(得分:4)

使用哈希(例如md5或sha1)执行此操作,然后对路径的每个段使用2个字符。如果你深入4级,你将永远是好的:

f4/a7/b4/66/funnyimage.jpg

哦,将它全部转储到1个目录中的原因很慢,因为大多数文件系统都不会将文件名存储在B-TREE或类似的结构中。它必须经常扫描整个目录以查找文件。

散列很好的原因是因为它具有非常好的分布。 26个目录可能无法删除它,特别是如果许多图像具有像“image0001.jpg”这样的文件名

答案 1 :(得分:3)

由于ext3旨在向后兼容早期的ext2,因此许多磁盘上的结构与ext2类似。因此,ext3缺少最近的功能,例如扩展区,inode的动态分配和块子分配。[15]一个目录最多可以有31998个子目录,因为一个inode最多可以有32000个链接。[16]

答案 2 :(得分:1)

unix文件系统上的目录只是一个列出文件名的文件,以及inode包含实际文件数据的文件。因此,扫描目录中的特定文件名可归结为打开文本文件和扫描包含特定文本的行的等效操作。

在某些时候,打开该目录“文件”并扫描您的文件名的开销将超过使用多个子目录的开销。通常,直到有数千个文件才会发生这种情况。您应该对系统/服务器进行基准测试,以找到交叉点的位置。

之后,决定如何将文件名拆分为子目录是一件简单的事情。如果你只允许字母数字字符,那么基于前2个字符(1,296个可能的子目录)的分割可能比具有10,000个文件的单个目录更有意义。

当然,对于你添加的每个额外分割级别,你都迫使系统打开另一个目录“文件”并扫描你的文件名,所以不要过分深入分割。

答案 3 :(得分:0)

您的设置没问题。继续这样做

答案 4 :(得分:0)

您似乎正走在正确的道路上。 ServerFault的另一篇文章似乎证实你做的是正确的。

答案 5 :(得分:0)

我认为linux对目录可以包含的文件数量有限制;最好将它们分开。

使用您的方法,您可以拥有具有许多不同文件名的完全相同的图像。此外,您将拥有更多以“t”开头的图像,而不是“q”,因此目录仍会变大。您可能希望将它们存储为MD5-HASH.jpg。这将消除重复,并在36个目录上具有更均匀的分布。

编辑:Evert类似,您可以执行多级目录结构,以使目录大小更小。