将大量图像存储在单个目录中会减慢图像检索速度吗?

sqr*_*ram 15 file-upload structure

如果我有一个网站,用户可以上传任意数量的图像(想想像photobucket一样),设置文件存储的最佳方法是什么(同样,所有上传都有一个独特的随机时间戳)?

site root
--username
----image1.jpg
----image2.jpg
----image3.jpg
--anotheruser
----image1.jpg
----image2.jpg
----image3.jpg
...
Run Code Online (Sandbox Code Playgroud)

要么

siteroot
--uploads
----image1.jpg
----image2.jpg
----image3.jpg
----image4.jpg
----image6.jpg
...
----image50000.jpg
Run Code Online (Sandbox Code Playgroud)

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

---编辑---

感谢到目前为止的伟大答案.此外,我将创建缩略图,所以我也必须在某处插入该目录... 或者,创建一个命名约定,如thumb_whatever.jpg.

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

Dav*_*man 19

目录中的文件数应该对读取文件数据所需的时间完全没有影响 - 但是在开始读取文件之前它可能会大大影响查找文件所需的时间.

主要问题启动的确切断点将从文件系统类型到文件系统类型不等,但是,一般来说,如果您谈论的是几百个文件,则不需要担心它.如果你谈的是几千,那么值得思考,也许还要做一些基准测试,看看你的文件系统和硬件如何处理它.如果你在谈论成千上万的文件,那么你真的需要开始解决问题.(我曾经有一个Linux/e2fs打印服务器,其中CUPS在完成打印后没有删除其作业控制文件,并且它在一个目录中获得了大约100,000个文件.只是获取目录列表花了半个多小时才开始显示任何文件名.)

但是,按用户名分隔它们可能不是最佳选择,因为很可能会有很多用户上传很少的图片,也许还有一些人上传了数百或数千张图片,可能会在这些用户的存储空间中产生访问时间问题目录.在这种情况下,更大的问题是你可能最终(假设一个成功的网站)有成千上万的用户和大量的子目录与大量的文件一样糟糕,因为减慢了对你的访问速度的影响数据.

由于您将要对它们设置时间戳,我可能会做的是根据时间戳的最后三位将它们放入子目录中.这将在1000个子目录中相对均匀地分布文件,并且应该使每个目录中的文件数量保持相当小.(使用前三个数字会导致一个目录被填充,然后移动到下一个目录而不是均匀地分配它们.)如果你在每个子目录中仍然有太多文件(这可能意味着你正在处理几个百万上传的图像),你可以为前三个数字添加第二个级别,所以upload-1234567890.jpg将最终在/567/890/upload-1234567890.jpg.

  • 非常有趣的技术 (2认同)

Chr*_*s J 5

答案就是"也许".文件检索可能没什么问题,但如果您需要对文件夹进行任何维护,那么当进程尝试枚举目录列表时,这将是一个巨大的麻烦.

什么会改善这种情况将是images文件夹下的一些子目录(或两个级别,具体取决于你正在查看的图像数量),所以你有一个像这样的层次结构:

siteroot
-- uploads
---- a
---- b
---- c
  :
---- z
Run Code Online (Sandbox Code Playgroud)

...然后根据第一个字母存储文件(所有名称以'a'开头的图像都进入文件夹'a').你可以把它作为一个两个或三个字母的后缀(aa,ab,ac,ad ...,ba,bb,bc ...,zx,zy,zz),并且可能还有一个层次结构,所以你拆分多个文件夹中的文件,取决于名称的前四个字符.

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

您可能需要考虑混合使用选项(1)和在层次结构上拆分图像,如上所述.这将确保如果单个用户确实上传了大量文件,那么您就会受到保护.同样,如果您正在查看许多用户目录,则同样的原则适用于确保您在单个父项下没有1,000,000个用户目录.

  • @reinier - 无论您使用何种策略,都会遇到磁盘空间问题.在一天结束时,由软件来正确处理故障.如果你正在考虑inode计数,那么两个层次结构的文件夹是676个节点(假设只有AZ).OP涉及成千上万的文件.添加几个目录不会对此产生影响. (3认同)