sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför förbrukar iteration genom en stor Django QuerySet enorma mängder minne?

Nate C var nära, men inte riktigt.

Från dokumenten:

Du kan utvärdera en QuerySet på följande sätt:

  • Iteration. En QuerySet är iterabel och den kör sin databasfråga första gången du itererar över den. Detta kommer till exempel att skriva ut rubriken för alla poster i databasen:

    for e in Entry.objects.all():
        print e.headline
    

Så dina tio miljoner rader hämtas, alla på en gång, när du först går in i den slingan och får den itererande formen av frågeuppsättningen. Väntan du upplever är att Django laddar databasraderna och skapar objekt för var och en, innan du returnerar något du faktiskt kan iterera över. Då har du allt i minnet, och resultaten rinner ut.

Från min läsning av dokumenten, iterator() gör inget annat än att kringgå QuerySets interna cachningsmekanismer. Jag tror att det kan vara vettigt att göra en sak en och en, men det skulle omvänt kräva tio miljoner individuella träffar på din databas. Kanske inte så önskvärt.

Att effektivt iterera över stora datamängder är något vi fortfarande inte har fått helt rätt på, men det finns några utdrag där ute som du kan ha nytta av för dina syften:

  • Minneseffektiv Django QuerySet iterator
  • batchfrågeuppsättningar
  • QuerySet Foreach


  1. Hur COUNT() fungerar i SQL Server

  2. MySQL mellan klausul inte inkluderande?

  3. Hur UUID_SHORT() fungerar i MariaDB

  4. DBA - Hur man dödar alla databasprocesser på SQL Server