sql >> Databáze >  >> RDS >> PostgreSQL

Proč iterace přes velký Django QuerySet spotřebovává obrovské množství paměti?

Nate C byl blízko, ale ne tak docela.

Z dokumentů:

QuerySet můžete vyhodnotit následujícími způsoby:

  • Opakování. Sada QuerySet je iterovatelná a svůj databázový dotaz provede při prvním iterování. Například se vytiskne titulek všech záznamů v databázi:

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

Takže se načte vašich deset milionů řádků, všechny najednou, když poprvé vstoupíte do této smyčky a získáte iterační formu sady dotazů. Čekání, které zažijete, je, že Django načte databázové řádky a vytvoří objekty pro každý z nich, než vrátí něco, co můžete skutečně iterovat. Pak máte vše v paměti a výsledky se objeví.

Z mého čtení dokumentů iterator() nedělá nic jiného, ​​než že obchází interní mechanismy mezipaměti QuerySet. Myslím, že by mohlo mít smysl dělat jednu věc po jedné, ale to by naopak vyžadovalo deset milionů jednotlivých zásahů do vaší databáze. Možná to není tak žádoucí.

Efektivní opakování velkých datových sad je něco, co se nám stále nepodařilo úplně správně, ale existují některé úryvky, které by se vám mohly hodit pro vaše účely:

  • Paměťově efektivní iterátor Django QuerySet
  • dávkové sady dotazů
  • QuerySet Foreach


  1. Oracle Database Explorer:bezplatné školení a akreditace

  2. Falešné omezení cizího klíče selhalo

  3. Jak funguje načítání dat ze serveru SQL Server do SqlDataReader?

  4. Notace UML