【问题标题】:How should I store user-uploaded images for a web application?我应该如何为 Web 应用程序存储用户上传的图像?
【发布时间】:2015-11-24 13:54:23
【问题描述】:

在我的网络服务器上,我有两个文件夹 showcasethumbnail 分别用于存储图像及其缩略图。数据库获取这些图像以将它们显示在页面上。

showcase 表中的表列是s_image,其中存储了类似/showcase/urlcode.jpg 的内容。

我听说一个文件夹中有大约 10-20k 个文件后,它开始变慢。那么我应该创建第二个文件夹showcase2 填满后吗?是否有某种自动创建可以为我做到这一点?

感谢您的意见。

【问题讨论】:

    标签: database web-applications filesystems filenames scalability


    【解决方案1】:

    当您将数以万计的文件放在一个目录中时,您使用的文件系统很重要。 Linux 上的 extfs4 比 Windows 上的 NTFS 扩展得更好。

    Windows 具有 8.3 文件名的兼容模式(旧的 DOS 文件名标准)。这会导致每个长于abcdefgh.ext 的文件名都为其创建一个别名,例如abcd~123.ext。这很慢,并且当您在单个目录中有大量文件时会变得非常慢。您可以关闭这种古老的兼容性行为。看这里。 https://support.microsoft.com/en-us/kb/121007。如果您关闭它,它可以快速解决直接的性能问题。

    但是,一个目录中的 20,000 个文件是一个很大的数字。在任何类型的文件系统上,最好的选择是根据更改的内容在文件系统中自动创建子目录。一种策略是根据年/月创建子目录,例如

     /showcase/2015/08/image1.jpg  (for images uploaded this month)
     /showcase/2015/09/image7.jpg  (for images next month)
    

    将那些较长的文件名存储在表中的s_image 列中显然没有问题。

    或者,如果你有一些系统来命名图像,利用它来创建子目录。例如,如果您的图像被命名

     cat0001.jpg
     cat0002.jpb
     ...
     cat0456.jpg
     ...
     cat0987.jpg
    

    您可以根据名称的前五个字母创建子目录

     /showcase/cat00/cat0001.jpg
     /showcase/cat00/cat0002.jpb
     ...
     /showcase/cat04/cat0456.jpg
     ...
     /showcase/cat09/cat0987.jpg
    

    如果您这样做,最好保持图像名称完整而不是缩短它们(例如,不要这样做/showcase/cat09/87.jpg),因为如果您必须按名称搜索特定图像,您希望那里有全名。

    据我所知,文件系统中没有什么可以自动为您执行此操作。但是在你的程序中做起来并不难。

    【讨论】:

    • 感谢您的回答 - 我现在要试用 Amazon S3,看看我能做什么。
    • 即使在 S3 中,您也不希望存储桶中的一个目录中有数万个项目。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多