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

psycopg2 prosakuje paměť po velkém dotazu

Narazil jsem na podobný problém a po několika hodinách krve, potu a slz jsem zjistil, že odpověď jednoduše vyžaduje přidání jednoho parametru.

Místo

cursor = conn.cursor()

napište

cursor = conn.cursor(name="my_cursor_name")

nebo ještě jednodušší

cursor = conn.cursor("my_cursor_name")

Podrobnosti najdete na http://initd.org/psycopg/docs/usage.html#server-side-cursors

Zjistil jsem, že pokyny jsou trochu matoucí v tom, že bych musel přepsat své SQL tak, aby obsahoval „DECLARE my_cursor_name ....“ a pak „FETCH count 2000 FROM my_cursor_name“, ale ukázalo se, že psycopg to vše za vás udělá pod kryt, pokud při vytváření kurzoru jednoduše přepíšete výchozí parametr "name=None".

Výše uvedený návrh na použití fetchone nebo fetchmany problém nevyřeší, protože pokud ponecháte parametr name nenastavený, psycopg se standardně pokusí načíst celý dotaz do ram. Jediná další věc, kterou možná budete muset udělat (kromě deklarace parametru name), je změnit atribut kurzor.itersize z výchozích 2000 na řekněme 1000, pokud máte stále příliš málo paměti.



  1. Rozdíl mezi oracle DATE a TIMESTAMP

  2. Jak najít cestu pg_config

  3. Kdy je lepší ukládat příznaky jako bitovou masku, než používat asociativní tabulku?

  4. Python:osvědčený postup a nejbezpečnější způsob připojení k MySQL a provádění dotazů