我目前正在构build一个能够生成大量图像的应用程序(几万张图像,可能更多,但不会在不久的将来)。 我希望能够确定一个文件是否存在,并通过http发送给客户端(我使用Apache是我的Web服务器)。
做这个的最好方式是什么? 我想过把图像分割成几个文件夹,并减less每个目录中的文件数量。 例如,可以说我决定每个文件名都以abc开头的小写字母开头。 比我创build26个目录,当我想要查找一个文件,我将首先添加目录的名称。 例如,如果我想要一个名为“funnyimage2.jpg”的文件,我将它保存在一个名为“f”的目录中。 如果需要,我可以将图层添加到该结构中。
说实话,我甚至不确定是否将所有文件保存在一个目录中并不是那么好,所以如果你可以添加一个解释为什么你的解决scheme更好,这将是非常有帮助的。
ps我的应用程序是用PHP编写的,我打算使用file_exists来检查文件是否存在。
如何找出一个过程需要的linuxfunction?
ldd在x86 Linux上显示不同的地址
关于fork和execve系统调用
Linux上真的没有asynchronous块I / O吗?
sed:只是想删除一个子string
用用户input运行crontab
调用clock()时出现分段错误
如何获得debuggingpostgres的权限?
从批处理Linux到Windows的awk和sed命令。 如何转换?
Graylog2服务器无法连接到ElasticSearch
用散列(如md5或sha1)执行此操作,然后为路径的每个段使用2个字符。 如果你深入四级,你将永远是好的:
f4/a7/b4/66/funnyimage.jpg
噢,它缓慢的原因全部转储到一个目录,是因为大多数文件系统不会将文件名存储在B-TREE或类似的结构中。 它将不得不扫描整个目录来经常查找文件。
哈希的原因很好,因为它的分布非常好。 26个目录可能无法剪切,尤其是如果很多图像具有“image0001.jpg”
由于ext3的目的是向后兼容早期的ext2,因此许多磁盘上的结构与ext2类似。 因此,ext3缺乏最近的特征,如扩展,inode的动态分配和块子分配。 一个目录最多可以有31998个子目录,因为一个inode最多可以有32000个链接[16]。
unix文件系统上的目录只是一个列出文件名和inode包含实际文件数据的文件。 因此,扫描特定文件名的目录归结为打开文本文件和扫描具有特定文本的行的等效操作。
在某些时候,打开该目录“文件”和扫描文件名的开销将超过使用多个子目录的开销。 一般来说,这将不会发生,直到有成千上万的文件。 您应该对您的系统/服务器进行基准测试,以查找交叉点的位置。
之后,决定如何将你的文件名分割成子目录是一件简单的事情。 如果只允许字母数字字符,那么基于前2个字符(1,296个可能的子字符串)的拆分可能比单个具有10,000个文件的目录更有意义。
当然,对于你添加的每一个额外的分割级别,你都迫使系统打开另一个目录“文件”并扫描你的文件名,所以不要过分深入分割。
你的设置是好的。 继续这样
看来你在正确的道路上。 serverFault的另一篇文章似乎证实你正在做正确的事情。
我认为linux对目录可以包含的文件数量有限制; 最好把它们分开。
用你的方法,你可以有许多不同的文件名称相同的确切图像。 此外,你会有更多的图像,以“T”开始比“Q”,所以目录仍然会变大。 您可能需要将它们存储为MD5-HASH.jpg。 这将消除重复并且在36个目录上具有更均匀的分布。
编辑:像Evert提到的,你可以做一个多级目录结构来保持目录的大小更小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。