什么是存储500,000张图片最高效的方法?

5
我正在为一个每时每刻都有大约40000人在线的网站编写一个基本的图片库。用户可以创建画廊并上传图片。
我的问题是,我应该为每个画廊创建一个单独的文件夹并在其中放置图像,还是创建一个单一的文件夹并将所有图像放入其中,但在数据库中保留每个图像的gallery_id?还是应该为每个用户创建一个目录,然后再在其中创建一个目录用于存放画廊名称?
你会如何做这件事?
附言:我需要它尽可能轻巧。

Linux(CentOS)。由于我无法访问他们的服务器,因此我不知道文件系统。 - Aristona
1
我会考虑使用亚马逊S3及其API,不存储文件夹,只使用关系型数据库中的表来跟踪它们。 - Kai Qing
1
如果你真的面临着每时每刻有4万个活跃用户的问题,那么你最大的问题就是带宽和存储空间了。你应该考虑将图片存储在CDN上,这样文件夹结构就不再是需要担心的事情。 - deceze
3个回答

9
我会按照id存储它们,并将它们分成文件夹(取决于文件系统,有些无法处理一个文件夹中有大量文件的情况),此外,如果您必须手动查找某些东西,这样更容易找到它们。
为每个文件分配一个id,然后使用文件名的前3个数字将它们拆分成文件夹。(您可以从100000开始自动递增计数器或填充id,以便至少有3个级别)
/photos/1/0/3/103456.jpg
/photos/9/4/1/941000.jpg
/photos/0/0/0/000001.jpg

您可以在数据库中存储照片与用户/画廊等之间的关系。

或者,如果您想看看大公司是如何做的:

针在大海捞针:高效存储数十亿张照片


2
+1 这是一个很好的答案,但我建议使用哈希函数,就像我在我的答案中所说的那样,以确保ID均匀分布,避免在一个文件夹中有太多的文件。 - hackartist
1
很好的建议。这样划分可以在将来进行分区。例如,第一个数字可以表示它所在的服务器,而不是目录。我管理一个拥有超过1000万张图片的网站,我们使用类似的设置。 - Brent Baisley
非常感谢,我已将您的回复标记为答案。 - Aristona

3
通常情况下,网络服务器不希望您在单个文件夹中存放超过几千张图片(我最近处理了7万张图片导致读取和排序速度极慢,所以请相信我),因此如果您认为会有数千张图片,绝不能只使用一个文件夹。我建议最佳解决方案是使用亚马逊的S3托管并连接到他们的CDN CloudFront,但如果这不现实,您仍然可以在自己的服务器上做一些事情。
像您建议的那样,为每个图库建立一个单独的文件夹,但前提是您知道图库的大小以及将创建多少个图库。(这是我目前建议您的特定问题解决方案)
将图片名称通过哈希函数进行处理,然后使用哈希的前1-3个字符来命名文件夹以将图片放入其中。哈希确保图片大致平均分布在各个文件夹中,您可以决定需要多少个文件夹。
无论如何,在路径中包含图库和图像ID的信息对于您在代码中和每当人类需要在服务器上寻找错误时都可能非常有用。我可能会根据图库ID命名文件夹,并确保任何图库中的图片都不超过几千张。

0

我是这样存储我的:

images/userid/photoid

这样我就可以在以后需要检查时快速隔离用户图像。这似乎比将它们全部放在一个中央目录中更有组织性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接