如何在django模型操作中不花费大量内存

时间:2010-08-30 09:48:07

标签: django

我有以下型号:

model rank(Models.model):
    username = models.CharField(max_length=200, default=0)
    points = models.IntegerField(default=0)
    rank = models.IntegerFiel(default=0)

我想要的是,基于'点'重新计算这个模型,将结果设置在'rank'字段中。


i=0
user_list = db.Rank.objects.get.all().order_by('-points')

for user in user_list:
   user.rank = i
   user.save()
   i += 1

这个工作正常,但1800用户我花了130 MB的MEMORY !!!! Webfaction想要杀死我:)。

我怎么能这样做,而不用花很多钱?

2 个答案:

答案 0 :(得分:4)

内存泄漏的直接原因可能是您将DEBUG设置为True。启用调试后,Django会将其运行的所有查询保留在内存中。尝试使用DEBUG关闭,您应该会看到使用率大幅下降。

答案 1 :(得分:1)

执行此操作的一种方法是使用custom query动态计算排名。这样您就可以将排名计算留给数据库了。这个tutorial对如何解决它有一个很好的解释。

以下是根据您的模型修改链接网站的查询:

SELECT r1.username, r1.points, COUNT(r2.points) rank
FROM app_rank r1, app_rank r2 
WHERE r1.points <= r2.points or (r1.points = r2.points and r1.username = r2.username) 
GROUP BY r1.username, r1.points
ORDER BY r1.points DESC, r1.username DESC;

另外,您可以在不使用计数器变量i的情况下重写循环。

for index, user in enumerate(user_list):
   user.rank = index + 1
   user.save()