PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо итерацията през голям Django QuerySet консумира огромни количества памет?

Nate C беше близо, но не съвсем.

От документите:

Можете да оцените QuerySet по следните начини:

  • Повторение. QuerySet е итерируем и изпълнява своята заявка за база данни при първия път, когато го повторите. Например, това ще отпечата заглавието на всички записи в базата данни:

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

Така че вашите десет милиона реда се извличат наведнъж, когато за първи път влезете в този цикъл и получите повторящата се форма на набора от заявки. Чакането, което изпитвате, е Django, който зарежда редовете на базата данни и създава обекти за всеки от тях, преди да върне нещо, което всъщност можете да повторите. Тогава имате всичко в паметта и резултатите излизат на бял свят.

От моя прочит на документите, iterator() не прави нищо повече от заобикаляне на вътрешните механизми за кеширане на QuerySet. Мисля, че може да има смисъл да се прави едно по едно нещо, но това ще изисква десет милиона отделни посещения във вашата база данни. Може би не е толкова желано.

Ефективното итериране на големи набори от данни е нещо, което все още не сме се оправили съвсем правилно, но има някои фрагменти, които може да намерите полезни за вашите цели:

  • Ефективен от паметта итератор на Django QuerySet
  • пакетни набори от заявки
  • QuerySet Foreach


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Стартиране на хранилище за данни на PostgreSQL

  2. Как да конкатенираме колони в Postgres SELECT?

  3. Присъединете се към заявка за броене на generate_series() и извлечете нулеви стойности като '0'

  4. Изберете броя на редовете в друга таблица в оператор SELECT на Postgres

  5. ActiveRecord::AdapterNotSpecified конфигурацията на базата данни не посочва адаптер