为什么Django没有发布获取的db对象?

时间:2013-10-23 11:47:32

标签: python django memory-leaks

我有一个非常简单的django app:

models.py:

class Product(models.Model):
        name = models.CharField(max_length=1000, default="")
        desc = models.TextField(default="")

views.py:

from django.http import HttpResponse
from models import Product

def fetch(request):
        for p in Product.objects.all()[:300000]:
                pass
        return HttpResponse("done")

我在MySQL数据库中加载了300k样本记录,在settings.py中关闭了调试并尝试执行fetch视图 - 完成后,django仍然位于700Mb的RAM上

我知道需要内存才能获取所有这些300k对象,但为什么它会在视图函数退出后保留它们?

再次,我与DEBUG=False一起,尝试使用django dev web服务器,并使用uwsgi并使用相同的奇怪行为。

P.S。在python2.6 / 2.7 Linux 64位上使用Django 1.4和1.5.4验证

2 个答案:

答案 0 :(得分:2)

这与Django无关。通常,Python在需要之前不会将内存返回给操作系统。

有关详细信息,请参阅the effbot's explanation

答案 1 :(得分:0)

这一行是罪魁祸首

for p in Product.objects.all()[:300000]:

切片强制QuerySet进行评估,即。点击数据库,然后返回一个包含对象切片的list(),然后您可以迭代它们。 并且Django's QuerySet cache将其保留在内存中,因为您可能希望再次迭代相同的“QuerySet”。

您可以使用迭代器来优化它。

它位于docs here