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