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.