【问题标题】:Performance impact of storing user images as binary data vs. static files in a multi-platform project?在多平台项目中将用户图像存储为二进制数据与静态文件的性能影响?
【发布时间】:2016-01-26 10:44:47
【问题描述】:

我有一个项目,它有一个在 Django 中开发的 Web 实现以及在 Android 和 iOS 中的移动实现。其中一项功能是允许用户上传图像。关于将它们存储为二进制数组以及将它们存储为文件服务器提供的静态文件的文章有很多。是否有任何可行的解决方案对所有三个平台都足够高效?

【问题讨论】:

  • 绝对是静态文件! :) 静态文件可以被缓存,通过 CDN 等提供服务,即使没有这些,它们对于 Web 服务器的服务效率要高得多,而不是从数据库中加载它们
  • 谢谢。如果移动平台也是如此,您是否会想到任何想法?
  • 你的两个选择对性能的影响都在服务器端,所以是的。

标签: android ios django performance


【解决方案1】:

绝对是静态文件!

静态文件可以由网络服务器缓存,通过 CDN 等提供服务。即使没有这些,它们对于网络服务器直接从磁盘提供服务更有效,而不是让数据库从表中加载它们。

用户上传的文件在 Django 中称为“媒体文件”,以将它们与“静态文件”区分开来,“静态文件”是您网站中不变的部分(即核心设计)。但是,在为他们服务时,方法是相同的。

文档中有一些细节:
https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development
您将在那里看到注释,您不应该让 Django 本身为静态或媒体文件提供服务,除非在开发期间。这意味着您需要设置 Web 服务器来提供文件。

这里的文档中的一些详细信息:
https://docs.djangoproject.com/en/1.9/howto/static-files/deployment/

另一种高效且易于设置(并且似乎与上述建议相矛盾)的替代方法是使用:
https://pypi.python.org/pypi/django-rednoise/

...RedNose 旨在与 CDN 结合使用(例如 Amazon Cloudfront,如果您在 AWS 上托管)- 在这种情况下,Django 可以处理静态+媒体文件,因为它们将最终由 CDN 提供服务。

至于特定于移动性能的问题,您应该查看:
https://www.ampproject.org/

【讨论】:

    【解决方案2】:

    Django 提供了处理图片上传的逻辑,参见docs。 根据我自己的经验,我可以说在 django 环境中,让 django 通过其图像字段完成工作要方便得多。 只需创建一个模型:

    class UserImage(models.Model):
        image = models.ImageField(upload_to='test')
        user = models.ForeignKey(User)
    

    这将为您处理所有逻辑并将新图像文件保存到服务器上的指定目录。优点是您可以通过http://yourdomain.com/media/test/image.png 直接访问这些文件。

    【讨论】:

    • 也许我的问题不清楚。您描述的方式基本上将图像作为静态文件存储在给定路径的引用位置。我正在尝试评估将图像存储为静态文件或将它们保存为数据库中的二进制字段是否更有意义。
    • 值得指出的是,您将指向您的 Web 服务器直接从该目录提供文件,这样就无需通过 Django 提供文件。
    • 我认为为您的用例将数据存储在数据库中没有意义。有一些有意义的用例(例如,如果您想在其他地方备份或镜像您的数据库,创建转储等)。将它们作为文件存储在您的服务器上是更直接的方法,而且我不知道将它们存储在数据库中会提高您的性能......撇开直接从数据库中写入和读取数据有更多的麻烦...
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2020-01-05
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多