这是一个完全理论性的问题。
我有一个照片存储网站,在该网站上注册的用户可以上传照片。
问题
- 哪种方法更快
- 当我需要使用大量电脑和硬盘
- 还有其他更好的方法吗
现在我想到了两种方法来完成这些事情。
上传到我的服务器的文件预计将是巨大的~>1亿
方法1
这两个CCD_ 1&/pictures/low/
目录将包含用户上传的所有文件。
$newfilename = $user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics
通过将其插入mysql
insert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')
方法2
这两个CCD_ 3&/pictures/low/
目录将包含用户上传的文件的子目录。
这将创建许多名为user_id
的子目录,用户正在将文件上传到服务器中
if (!is_dir('/pictures/hd/'.$user_id.'/')) {
mkdir('/pictures/hd/'.$user_id.'/');
}
$newfilename = $user_id.'/'.$user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics
通过将其插入mysql
insert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')
检索
检索图像时,我可以使用pics
表的src
列来获取文件名,并使用'/pictures/hd/'.$src_of_picstable
浏览hd文件,使用'/pictures/low/'.$src_of_picstable
回答问题的正确方法是测试它。
哪个更快取决于文件的数量和欠同步文件系统;ext3,4将非常愉快地处理单个目录中的大量文件(在HTree索引中管理的dentries-atr)。有些文件系统只使用简单的列表。其他人有不同的优化文件访问的方法。
扩展的第一个问题是如何跨多个磁盘管理文件集。仅仅在多个磁盘上扩展一个文件系统是个坏主意。如果你有很多目录,那么你可以有很多挂载点。但是,当你处理terrabytes的数据时,这并不能很好地工作。
然而,内容是独立于文件存储的索引,这意味着您现在为文件存储选择什么并不重要,因为您以后可以轻松地更改文件到位置的映射,而无需移动现有数据集。
我不建议使用单目录方法,原因有两个。首先,如果你计划有很多图像,你的目录会变得很大。手动搜索单个图像将花费更长的时间。当你调试一些ir测试新功能时,这将是必要的。
使用多个目录的第二个原因是,您可以对库的一部分进行较小的备份。如果你有一个非常大的图库(比如说几TB),单个硬盘可能不足以容纳所有这些。使用多个目录,您可以将每个目录安装在单独的硬盘驱动器上,这样可以处理几乎无限大小的图库。
我最喜欢的方法是YYYY/MM/类型的图像目录结构。这样你就可以通过逐月查看来发现你什么时候引入了一些bug。此外,您还可以在不复制冗余文件的情况下每月进行备份。还制作了所有画廊的季度快照,以防万一。
关于图像类型,我可能需要几种类型的图像,如原始图像、小缩略图、缩略图、普通图像等。这样我就可以交换图像类型并获得不同的图像大小。
至于你,我建议YYYY/MM/type-of-image/user_id方法,在那里你可以很容易地在一个地方找到所有用户上传的文件。