【问题标题】:Number of items (models) in a database versus django RAM consumption?数据库中的项目(模型)数量与 django RAM 消耗?
【发布时间】:2013-06-21 19:59:04
【问题描述】:

我认为这是我自己的 django 代码中的一个错误,但只是想确定一下。

数据库中的行数或模型数是否会影响我的 django RAM 消耗? 假设我们有一个名为 Model 的 mysql 表。 我的 django 代码只有这种形式的惰性查询集评估:

Models.objects.filter().blah().blah()[:SOME_NUMBER]

SOME_NUMBER 保持不变,因此被带到内存中的数据也是不变的,并且与“模型”的总数无关(或者至少我希望如此)。但是,在我的进程选项卡中,随着我的模型数量增加,RAM 也会增加.. 以至于它变得太高了!

这是故意的还是其他原因导致的? 除了 queryset - db 调用,还有什么会导致高内存消耗和泄漏?如果没有别的,我的代码中一定有某个地方我正在查询一堆模型,我不知道。我的 DJANGO_DEBUG 设置已关闭。

谢谢。

【问题讨论】:

  • 您的设置中有 DEBUG=True 吗?
  • 不,它已关闭。我知道这会导致内存泄漏。
  • 你是如何运行 django 的?你的设置是什么?
  • 使用 MySql、Mod_Wsgi、apache2 以及静态资源的 nginx 反向代理运行它。我的整个应用程序有 6-8 个查询,只是有一堆模型。但无论如何,这不应该意味着 RAM 使用率会上升,不是吗?因为在我们查询之前,所有模型数据都存储在磁盘内存中。

标签: python mysql django orm


【解决方案1】:

如果问题是内存消耗,这很难从像这样的小代码示例中推测出来。要跟踪问题,您可能需要在应用程序中使用内存分析器。

Which Python Memory Profiler is Recommended 上的这个堆栈溢出问题提供了一个使用 Heapy 的简洁的好示例,展示了如何在代码中的某个位置打印出内存转储,并了解什么类型的对象正在占用内存.这应该为您跟踪内存泄漏提供了一个良好的起点。

【讨论】:

    【解决方案2】:

    您应该调查一些事情。 Django 不能保证生成最有效的查询(而且很多时候它做得很差)。数据库可能未针对您发送的查询正确调整,因此返回结果需要很长时间。


    实际发送到数据库的查询是什么?
    使用print str(MyModel.objects.filter(...).query) 查看正在构建的查询。您还可以打开 DEBUG(您应该在开发中,它的存在是有原因的)并运行

    from django.db import connection
    
    print connection.queries
    

    如何在数据库中评估该查询?
    从上面复制 SQL 并使用explain <the query> 在数据库中直接运行它。它将输出幕后发生的事情以及需要多长时间。例如,这可能表明您可以向外键添加索引以提高连接性能。可能是数据库在行数较少的情况下相当快,但复杂的查询可能会随着行数的增加而超过线性增长。


    您还可以使用Django Debug Toolbar 在您查看的页面上自动获取此信息。

    【讨论】:

      【解决方案3】:

      您为什么不暂时删除上述表中的某些行或删除所有其他表来检验您的假设?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多