如果我有一个网站,因为他们希望用户可以上传尽可能多的图像(认为的photobucket样),什么是建立文件存储的最佳方式(也,所有上传得到一个唯一的随机时间戳)?
site root
--username
----image1.jpg
----image2.jpg
----image3.jpg
--anotheruser
----image1.jpg
----image2.jpg
----image3.jpg
...
要么
siteroot
--uploads
----image1.jpg
----image2.jpg
----image3.jpg
----image4.jpg
----image6.jpg
...
----image50000.jpg
我认为第一种方法更有条理。 但我认为第二个方法是标准的(保持所有上传在同一目录),但我不知道如果要是有成千上万的图像在同一目录下,将获取的图像时会比较慢
---编辑---
感谢到目前为止伟大的答案。 此外,我将创建缩略图,所以我也必须从某个地方插入目录... 或者 ,创建一个命名约定,如thumb_whatever.jpg。
这么多不同的方式来做到这一点。 是的磁盘空间将是一个问题。 但现在我所关心的检索时间。 当我必须输出的图像浏览器,如果图像是在与其他10,000张的目录,我是如何缓慢,可能担心起来。
目录中的文件的数量应该没有影响到读取文件的数据所需要的时间在所有 - 但它可以大规模地影响到找到文件,然后才能开始读它需要的时间量。
其中的主要问题启动的确切断点将文件系统类型的不同而文件系统的类型,但是,在一般情况下,如果你在谈论几百个文件,你没有太多需要担心。 如果你在谈论几千元,这是值得我们思考的,也许做一个小的标杆,看看你的文件系统和硬件如何处理它。 如果你在谈论文件数以万计的,那么你真的需要开始摔东西了。 (我曾经有一个Linux / e2fs打印服务器,其中CUPS不删除其作业控制文件后,就完成打印,并且它在一个目录中大约100,000文件起身。刚开目录列表花了一个半小时以上之前,甚至开始显示任何文件名。)
按用户名分隔它们未必是最好的选择,不过,因为你可能有很多用户上传很少的图像,也许一对夫妇谁上传图片的数百或数千,有可能造成在这些用户的存储访问时间问题目录。 在那种情况下更大的问题是,你很可能有成千上万的用户和大量的子目录数千或数万结束(假设一个成功的网站)只是作为一个大量文件的坏放慢访问您的数据。
既然你要对他们有时间戳,我可能会做的就是把它们放到基于时间戳的最后三位数字子目录。 这将相对均匀地分布在整个文件1000个子目录,并应保留的文件的数量在每个目录相当小。 (使用前三个数字会导致一个目录移动到下一个,而不是分布均匀他们之前填写。)如果你仍然在每个子目录下的文件太多(这可能意味着你正在处理几个结束了百万上传的图片),您可以添加第二个级别的前三个数字,所以上传-1234567890.jpg将在/567/890/upload-1234567890.jpg结束。
这个问题的答案是“可能”。 这是可能的文件检索可能是好的,但如果你需要做的文件夹上的任何维护,这将是一个巨大的头疼的进程尝试OT枚举目录列表。
什么会改善这种情况将是数字图像文件夹下的子目录(或两个级别,这取决于有多少你看存储图像),让您拥有一个层次是这样的:
siteroot
-- uploads
---- a
---- b
---- c
:
---- z
...然后存储文件根据自己的第一个字母(因此与名称的所有图像开始“A”进入文件夹“A”)。 你可以有这样的两个或三个字母的后缀(AA,AB,AC,AD ......,BA,BB,BC ...,ZX,ZY,ZZ),并可能有下一个层次的,所以你拆跨越多个依赖于名称的前四个字符的文件夹中的文件。
如果文件然后分配一个随机的字母数字名称,然后这将确保文件在所有文件夹中均匀分布(给定样本量足够大)。
你可能想为我上面描述考虑您的选项(1)和分割图像的组合在一个层次。 这将确保,如果一个用户不上传大量的文件,那么你覆盖。 同样,如果您正在寻找大量的用户目录,同样的原则也适用,以确保你没有一个单亲下百万用户目录。
尝试使用MongoDB的 ...这是一个键值DB也允许存储二进制数据。 这是非常快速和有效,并且支持分片(在多台计算机将数据)的开箱
你真的不希望能有充分的文件夹和文件夹。 管理这些文件夹需要永远,并更改命名/后分方案是一场噩梦。 此外,如果你用完了磁盘空间的你有问题。 同样对于负载均衡,有一个硬盘满了文件的效率不高
我经常使用的模式是这样的:上传/(#ID%1000)/img_#id.jpg
其中#ID是OFC。 照片的ID号(整数)存储在数据库中。 这就提供了仅基于照片的ID的简单模式。
它依赖于文件系统上。 例如,FAT16往往是相当缓慢的,如果你有一个目录超过512个文件。 FAT32和NTFS不具有相同的限制,而且运行速度要慢得多,如果你有一个非常大的文件量。 即使您运行的是更强大的Linux文件系统之一,你还是要能够更快地如果他们是小解析目录。
我肯定会用#2去 - 用户将图像分割成目录。
我认为,上传目录下的子目录将是最好的。
site root
--uploads
----username
------image1.jpg
------image2.jpg
------image3.jpg
----anotheruser
------image1.jpg
------image2.jpg
------image3.jpg
...
根据主机的操作系统,有太多的文件在一个目录可能会导致一些麻烦和兼容性问题。 此外,这取决于你是如何得到的图像列表,它可能会导致性能问题。
另外,选择2将是一个烂摊子。 :)
文章来源: Does storing a lot of images in a single directory slow down image retrieval?