我有以下型号:
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想要杀死我:)。
我怎么能这样做,而不用花很多钱?
答案 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()