sql >> Database >  >> RDS >> PostgreSQL

Waarom kost het doorlopen van een grote Django-queryset enorme hoeveelheden geheugen?

Nate C was dichtbij, maar niet helemaal.

Uit de documenten:

U kunt een QuerySet op de volgende manieren evalueren:

  • iteratie. Een QuerySet is itereerbaar en voert zijn databasequery uit de eerste keer dat u eroverheen itereert. Dit zal bijvoorbeeld de kop van alle vermeldingen in de database afdrukken:

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

Dus je tien miljoen rijen worden in één keer opgehaald wanneer je voor het eerst die lus binnengaat en de itererende vorm van de queryset krijgt. Het wachten dat u ervaart, is dat Django de databaserijen laadt en voor elke rij objecten maakt, voordat u iets teruggeeft waar u daadwerkelijk over kunt herhalen. Dan heb je alles in het geheugen en komen de resultaten naar buiten.

Uit mijn lezing van de documenten, iterator() doet niets meer dan de interne caching-mechanismen van QuerySet omzeilen. Ik denk dat het misschien logisch is om één voor één iets te doen, maar dat zou omgekeerd tien miljoen individuele hits in je database vereisen. Misschien niet zo wenselijk.

Efficiënt itereren over grote datasets is iets dat we nog steeds niet helemaal goed hebben gedaan, maar er zijn enkele fragmenten die u misschien nuttig vindt voor uw doeleinden:

  • Geheugenefficiënte Django QuerySet-iterator
  • batch-querysets
  • QuerySet Forreach


  1. PERIOD_DIFF() Voorbeelden – MySQL

  2. Invoegen in meerdere tabellen in één query

  3. SQL Server Agent-waarschuwingen

  4. Hoe het MySQL-tekencoderingsprobleem op te lossen?