0

私は非常に単純なジャンゴアプリを持っています:

models.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 データベースに 30 万件のサンプル レコードをロードし、デバッグをオフにしてsettings.py、実行されたfetchビューを試しました。完了後も、django は 700Mb の RAM に残っています。

これらの 300k オブジェクトをすべて取得するにはメモリが必要であることは理解していますが、ビュー関数が終了した後もそれらを保持するのはなぜですか?

繰り返しますが、私はDEBUG=Falsedjango dev Web サーバーでこれを試し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()オブジェクトのスライスを含む が返されます。これを反復処理できます。また、Django の QuerySet キャッシュは、同じ "QuerySet" をもう一度繰り返したい場合があるため、それをメモリに保持します。

イテレータを使用してこれを最適化できます。

ここのドキュメントにあります

于 2013-10-23T11:50:53.897 に答える