数据库中的项目(模型)数量与django RAM消耗量的关系?

时间:2013-06-25 06:09:14

标签: python mysql django orm

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

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

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

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

这是否意味着或者是其他导致这种情况的东西? 除了queryset - db调用之外,还有什么可以导致高内存消耗和泄漏?如果没有别的,我的代码中必须有一个地方,我在查询一堆模型,我不知道。我的DJANGO_DEBUG设置已关闭。

谢谢。

3 个答案:

答案 0 :(得分:1)

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


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

from django.db import connection

print connection.queries

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


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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

为什么不暂时删除上述表格中的某些行或删除所有其他表格以测试您的假设?