我有一个非常简单的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验证
答案 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