【问题标题】:How to store millions of pictures about 2k each in size如何存储数百万张大约 2k 大小的图片
【发布时间】:2011-02-03 18:52:33
【问题描述】:

我们正在创建一个 ASP.Net MVC 站点,该站点需要存储超过 100 万张图片,大小约为 2k-5k。从以前的研究来看,文件服务器可能比数据库更好(否则请随意评论)。

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

【问题讨论】:

    标签: file filesystems image photos file-storage


    【解决方案1】:

    问题不在于文件系统无法在一个目录中存储如此多的文件,而是如果您想使用 Windows 资源管理器访问该目录将花费很长时间,因此如果您需要手动访问该文件夹您应该对其进行分段,例如,每 2-3 个名称的首字母/数字使用一个目录,甚至是更深的结构。

    如果你可以把它分成 1k 个文件夹和 1k 个文件,每个文件夹就绰绰有余了,代码也很简单。

    【讨论】:

      【解决方案2】:

      有关目录结构的一些讨论,另请参见 this Server Fault question

      【讨论】:

        【解决方案3】:

        我不排除使用内容交付网络。它们是为这个问题而设计的。我在 Amazon S3 上取得了很大的成功。由于您使用的是基于 Microsoft 的解决方案,因此 Azure 可能是一个不错的选择。

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

          • 虽然代码可能能够读取包含大量文件的目录中的文件,但这仍然不是一个好主意。如果您曾经尝试在资源管理器中打开包含数千个文件的目录,它会非常慢。散列到子目录对此有很大帮助。
          • 资源管理器的缓慢可能更多是由于资源管理器试图处理所有这些文件名而不是检索文件名本身。例如,读取所有文件并显示缩略图将需要很长时间。如果您已经知道文件名应该很快,则检索单个文件。如果您编写自己的系统来存储和检索文件,您可能会或可能不会获得比 NTFS 更好的性能。
          【解决方案5】:

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

          我会构建一个带有子目录的树,以便能够从一个 FS 移动到另一个:How many files can I put in a directory? 并避免一些问题:http://www.frank4dd.com/howto/various/maxfiles-per-dir.htm

          您还可以拥有包含相关图片的存档,以便在仅打开一个文件的情况下加载它们。这些档案可能会被压缩,瓶颈是 I/O,如果是 CPU,则未压缩。

          数据库更容易维护,但速度较慢......所以这取决于你!

          【讨论】:

            猜你喜欢
            • 2021-12-25
            • 2023-04-08
            • 1970-01-01
            • 2012-03-31
            • 1970-01-01
            • 2016-08-27
            • 2011-08-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多