File upload 在一个目录中存储大量图像会降低图像检索速度吗?

File upload 在一个目录中存储大量图像会降低图像检索速度吗?,file-upload,structure,File Upload,Structure,如果我有一个网站,用户可以上传任意数量的图像(想想photobucket),那么设置文件存储的最佳方式是什么(而且,所有上传都会有一个唯一的随机时间戳) 或 我认为第一种方法更有条理。但我认为第二种方法是标准的(将所有上传保持在同一目录中),但我想知道如果在同一目录中有数千个图像,那么在检索图像时是否会比较慢 ---编辑--- 谢谢你迄今为止的精彩回答。 此外,我将创建缩略图,所以我还必须将该目录插入某个位置。。。或者,创建一个命名约定,例如thumb_where.jpg 有很多不同的方法可以做

如果我有一个网站,用户可以上传任意数量的图像(想想photobucket),那么设置文件存储的最佳方式是什么(而且,所有上传都会有一个唯一的随机时间戳)

我认为第一种方法更有条理。但我认为第二种方法是标准的(将所有上传保持在同一目录中),但我想知道如果在同一目录中有数千个图像,那么在检索图像时是否会比较慢

---编辑---

谢谢你迄今为止的精彩回答。 此外,我将创建缩略图,所以我还必须将该目录插入某个位置。。。或者,创建一个命名约定,例如thumb_where.jpg

有很多不同的方法可以做到这一点。
是的,磁盘空间将是一个问题。但现在我关心的是检索时间。当我必须将图像输出到浏览器时,如果该图像位于包含10000个其他图像的目录中,我担心这会变得多么慢。

我认为上载目录下的子目录将是最好的

site root
--uploads
----username
------image1.jpg
------image2.jpg
------image3.jpg
----anotheruser
------image1.jpg
------image2.jpg
------image3.jpg
...
根据主机操作系统的不同,一个目录中的文件过多可能会导致一些麻烦和兼容性问题。此外,根据您获取图像列表的方式,它可能会导致性能问题

另外,选项2将是一片混乱

答案是“可能”。文件检索可能很好,但是如果您需要对文件夹进行任何维护,那么当进程试图枚举目录列表时,这将是一个非常头痛的问题

改善这种情况的方法是在images文件夹下有许多子目录(或两个级别,取决于您要存储的图像数量),因此您有如下层次结构:

siteroot
-- uploads
---- a
---- b
---- c
  :
---- z
…然后根据文件的第一个字母存储文件(因此名称以“a”开头的所有图像都进入文件夹“a”)。您可以将其作为两个或三个字母的后缀(aa、ab、ac、ad…、ba、bb、bc…、zx、zy、zz),并可能在其下具有层次结构,因此您可以根据名称的前四个字符在多个文件夹中拆分文件

如果随后为文件分配了一个随机字母数字名称,则这将确保文件均匀分布在所有文件夹中(给定足够大的样本大小)

您可能想考虑一下您的选项(1)和在上面所描述的层次结构上分割图像的混合。这将确保,如果一个用户确实上传了大量文件,那么你就被覆盖了。类似地,如果您正在查看大量用户目录,同样的原则也适用于确保在单个父目录下没有1000000个用户目录。

尝试使用。。。它是一个keyvalue数据库,还允许存储二进制数据。它非常快速、高效,支持即时切分(在多台机器上放置数据)


你真的不想让文件夹和文件夹充满文件。管理这些文件夹要花很长时间,以后更改命名/划分方案是一场噩梦。此外,如果磁盘空间不足,则会出现问题。另外,对于负载平衡,让一个硬盘上装满文件是没有效率的,这取决于文件系统。例如,如果一个目录中有512个以上的文件,FAT16往往会非常慢。FAT32和NTFS没有相同的限制,但如果文件量非常大,运行速度也会慢得多。即使您正在运行一个更健壮的Linux文件系统,如果目录更小,您仍然能够更快地解析目录


我肯定会选择#2-按用户将图像拆分为目录。

目录中的文件数量应该对读取文件数据所需的时间没有任何影响-但它会极大地影响在开始读取文件之前查找文件所需的时间

启动主要问题的确切断点因文件系统类型而异,但是,一般来说,如果您谈论的是几百个文件,您不需要太担心。如果您谈论的是几千个,那么值得考虑一下,或者做一些基准测试,看看您的文件系统和硬件如何处理它。如果你谈论的是成千上万的文件,那么你真的需要开始分解这些文件。(我曾经有一个Linux/e2fs打印服务器,CUPS在完成打印后没有删除其作业控制文件,它在一个目录中获得了大约100000个文件。仅仅获得一个目录列表就花了半个多小时,它甚至开始显示任何文件名。)

但是,按用户名将它们分开可能不是最佳选择,因为可能会有很多用户上载很少的图像,也可能有一些用户上载数百或数千个图像,这可能会在这些用户的存储目录中造成访问时间问题。在这种情况下,更大的问题是(假设一个成功的站点)最终可能会有数千或上万个用户,并且大量的子目录与大量的文件一样会降低对数据的访问速度


因为你会在它们上面有一个时间戳,我可能会根据时间戳的最后三位数字把它们放到子目录中。这将使文件相对均匀地分布在1000个子目录中,并使每个目录中的文件数量保持在合理的小范围内。(使用前三位数字会导致一个目录在移动到下一个目录之前被填满,而不是均匀分布。)如果每个子目录中的文件仍然过多(这可能意味着您要处理数百万张上传的图像),则可以为前三位数字添加第二级,因此upload-1234567890.jpg最终将位于/567/890/upload-1234567890.jpg。

我经常使用这样的模式: 上载/(#id%1000)/img#id.jpg

<
site root
--uploads
----username
------image1.jpg
------image2.jpg
------image3.jpg
----anotheruser
------image1.jpg
------image2.jpg
------image3.jpg
...
siteroot
-- uploads
---- a
---- b
---- c
  :
---- z