存储500.000张图像的最有效方法是什么?

时间:2012-02-17 01:26:39

标签: php optimization

我正在为一个网站编写一个基本图库,在任何时候都有大约40,000名在线人员。用户将能够创建图库并上传图像。

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

你会怎么做?

聚苯乙烯。我需要它尽可能轻。

3 个答案:

答案 0 :(得分: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 :(得分:3)

通常,Web服务器不希望您在一个文件夹中拥有超过几千个图像(我最近不得不处理70,000个图像,导致超慢读取和排序,因此请相信我)所以当然不是单个文件夹如果你认为你会有成千上万的图像。我建议最好的解决方案是主持亚马逊的S3连接到他们的CDN CloudFront,但如果这不现实,你仍然可以在你自己的服务器上做几件事。

为每个图库创建一个单独的文件夹,就像您建议的那样,只要您知道图库可以获得多大的界限,并了解将创建多少个图库。 (这就是我现在就你的具体问题所建议的)

将图像名称放入哈希函数,然后使用哈希的前1-3个字符命名文件夹以放入图像。哈希确保图像在文件夹之间大致相等,您可以决定需要多少个文件夹。

无论如何,在实际路径中具有哪个图库和图像ID的信息可能对您在代码中以及人类必须在服务器上捕获错误时向前移动有用。我可能会根据图库ID命名文件夹,并确保没有图库中有超过几千张图片。

答案 2 :(得分:0)

我这样存储我:

images/userid/photoid

这样,如果我需要在以后检查任何内容,我可以快速隔离用户图像。它似乎比将它们全部放在一个中央目录中更有条理。