我们正在创建一个ASP.NET MVC网站,该网站将需要存储100万次+图片,尺寸约为2K-5K。从以前的Ressearch来看,看起来文件服务器可能比DB好(否则请随时发表评论)。

存储这么多文件时是否有什么特别的考虑?如果一个文件夹中有这么多文件,Windows可以快速找到照片吗?是否需要创建分段的目录结构,例如将其划分为文件名?如果解决方案将至少1000万图片扩展到潜在的未来扩展需求,那就太好了。

有帮助吗?

解决方案

4KB是NTFS的默认集群大小。您可以根据通常的图片大小来调整此设置。http://support.microsoft.com/kb/314878

我会用子目录制造一棵树,以便能够从一个FS移动到另一个FS: 我可以将几个文件放入目录中?并避免一些问题: http://www.frank4dd.com/howto/various/maxfiles-per-dir.htm

您还可以拥有包含关联图片的档案,以将它们仅打开一个文件。 Thoses档案可能会被压缩,瓶颈是I/O,如果是CPU,则不会压缩。

DB更容易维护但较慢……因此取决于您!

其他提示

也可以看看 这个服务器故障问题 有关目录结构的一些讨论。

问题不是说文件系统无法在目录中存储这么多文件,而是要使用Windows Explorer访问该目录,它将永远使用,因此,如果您需要手动访问该文件夹,则应进行细分例如,每个2-3个名称的首字母/什至更深的结构的目录。

如果您可以将其划分为1K文件夹,每个文件夹都将远远足够,而要执行的代码非常简单。

假设NTFS,每个卷的限制为40亿个文件(2^32-1)。这是卷上所有文件夹的总限制(包括操作系统文件等)

单个文件夹中的大量文件不应该是问题。 NTFS使用B+树进行快速检索。 Microsoft建议您禁用短文件名称(该功能允许您将myPictureOfyou.html检索为mypic〜1.htm)。

我不知道将它们细分为多个目录是否有任何性能优势;我的猜测是没有优势,因为NTFS是为具有大型目录的性能而设计的。

如果您确实决定将它们细分为多个目录,请在文件名上使用哈希函数以获取目录名称(而不是目录名称是文件名的第一个字母),以便每个子目录的数字大致相同文件。

我不会排除使用内容交付网络。它们是为这个问题而设计的。我在亚马逊S3上取得了很大的成功。由于您使用的是基于微软的解决方案,因此Azure可能很合适。

是否有某种要求阻止您使用第三方解决方案?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top