4

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

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

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

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

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

谢谢你。

4

3 回答 3

1

If the issue is memory consumption, this is very difficult to speculate about from a small code example like this. To track down the problem you probably need to use a memory profiler in your application.

This stack overflow question on Which Python Memory Profiler is Recommended gives a good, concise example using Heapy that shows how you can print out a memory dump at some point in your code, and get a feel for what type of objects are occupying memory. This should give you a good starting point for tracking down the memory leak.

于 2013-07-03T06:18:41.010 回答
1

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


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

from django.db import connection

print connection.queries

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


您还可以使用Django 调试工具栏在您查看的页面上自动获取此信息。

于 2013-06-30T20:40:06.330 回答
0

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

于 2013-06-28T21:27:59.477 回答