0

我有非常简单的 django 应用程序:

模型.py:

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

视图.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 server 试过这个,也用uwsgi它同样奇怪的行为。

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

4

2 回答 2

2

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

有关更多详细信息,请参阅effbot 的说明

于 2013-10-23T12:05:25.860 回答
0

这条线是罪魁祸首

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

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

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

它在这里的文档中

于 2013-10-23T11:50:53.897 回答