sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor bruger iteration gennem et stort Django QuerySet enorme mængder hukommelse?

Nate C var tæt på, men ikke helt.

Fra dokumenterne:

Du kan evaluere et QuerySet på følgende måder:

  • Gentagelse. Et QuerySet kan itereres, og det udfører sin databaseforespørgsel første gang, du itererer over det. For eksempel vil dette udskrive overskriften på alle poster i databasen:

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

Så dine ti millioner rækker hentes på én gang, når du først går ind i den løkke og får forespørgselssættets itererende form. Ventetiden, du oplever, er, at Django indlæser databaserækkerne og skaber objekter for hver enkelt, før du returnerer noget, du faktisk kan gentage. Så har du alt i hukommelsen, og resultaterne vælter ud.

Fra min læsning af dokumenterne, iterator() gør intet andet end at omgå QuerySets interne caching-mekanismer. Jeg tror, ​​det kan give mening for det at gøre en en-til-en ting, men det ville omvendt kræve ti millioner individuelle hits på din database. Måske ikke så ønskværdigt.

At iterere over store datasæt effektivt er noget, vi stadig ikke har fået helt rigtigt, men der er nogle uddrag derude, som du måske kan finde nyttige til dine formål:

  • Hukommelseseffektiv Django QuerySet iterator
  • batchforespørgselssæt
  • QuerySet Foreach


  1. Kan jeg få navn på alle tabeller i SQL Server-databasen i C#-applikationen?

  2. Returner en liste over fremmede nøgler i SQLite

  3. Hvordan sender man vilkårlige parametre til Oracle trigger?

  4. 3 måder at opdage, om en streng matcher et regulært udtryk i MySQL