2012-02-17 129 views
4

我正在为网站编写一个基本画廊,在任何时候都有大约40,000名在线人员。用户将能够创建画廊和上传图像。什么是最有效的方式来存储500.000图像?

我的问题是,我应该为每个图库制作一个单独的文件夹,并将图像放入其中,或者制作一个文件夹并将所有图像放入其中,但是将数据库中每个图像的gallery_id保留下来?或者,我应该为每个用户制作一个目录,然后为其中的图库名称添加另一个目录?

你会如何做到这一点?

Ps。我需要它尽可能轻。

+1

什么操作系统和文件系统? – 2012-02-17 01:28:00

+0

Linux。 (Cent OS)我不知道文件系统,因为我没有访问他们的服务器。 – Aristona 2012-02-17 01:31:11

+1

我会考虑使用亚马逊S3和他们的API,不存储文件夹,只使用数据库中的关系表来跟踪它们。 – 2012-02-17 01:33:01

回答

8

我会通过ID 它们存储和我将它们分割成文件夹(文件系统相关的,有些不夹中的文件有很多文件执行好),再加上它更容易找到他们,如果你有手动看点东西

给每个文件一个id,然后使用文件名的前3位数字,将它们分成文件夹。 (你可以在100000填零的ID启动自动增长计数器,所以至少有3个级别

/photos/1/0/3/103456.jpg 
/photos/9/4/1/941000.jpg 
/photos/0/0/0/000001.jpg 

您可以照片到用户/库/等的关系存储在数据库中

或者,如果你想看到的大男孩怎么做呢

Needle in a haystack: efficient storage of billions of photos

+1

+1这是一个很好的答案,但我会建议使用散列函数,就像我在我的答案中所说的那样,以确保ID均匀分布,并且不会在一个文件夹中包含太多文件 – hackartist 2012-02-17 01:36:26

+1

极好的建议。将其分开,可以在将来的日期进行分区。例如,第一个数字可以是它所在的服务器,而不是目录。我管理一个拥有超过1000万图片的网站,我们使用类似的设置。 – 2012-02-17 01:37:52

+0

非常感谢你,答复你的回答。 – Aristona 2012-02-18 03:19:03

3

典型的Web服务器不希望你有比在单个文件夹几千图片更多(我最近不得不面对7万导致supe的图像慢速读取和排序,所以相信我)如果你认为你将有成千上万的图像,那么肯定不是一个文件夹。我建议最好的解决方案是将亚马逊的S3连接到他们的CDN CloudFront,但如果这样做不现实,您仍然可以在自己的服务器上执行几件事情。

为每个画廊建立一个单独的文件夹,就像你建议的,只有当你知道画廊有多大可以获得的一些界限并且有多少画廊将被创建的想法。 (这是我现在建议你的具体问题)

把图像名称通过哈希函数,然后使用散列的前1-3个字符命名文件夹放入图像。哈希确保图像在文件夹中大致相同,并且您可以决定需要多少个文件夹。

无论如何,在实际路径中有什么画廊和图像ID的信息可能对您在代码中以及每当人类需要在服务器上搜寻错误时都有用。我可能会根据图库ID命名这些文件夹,并确保没有任何图库中有超过几千幅图像。

0

我存储我的是这样的:

images/userid/photoid 

这样我可以快速隔离用户的图像,如果我需要在以后的日子来检查什么。看起来更有组织性,而不是将它们都放在一个中央目录中。

相关问题