Jeg løb ind i et lignende problem, og efter et par timers blod, sved og tårer fandt jeg ud af, at svaret blot kræver tilføjelse af én parameter.
I stedet for
cursor = conn.cursor()
skriv
cursor = conn.cursor(name="my_cursor_name")
eller endnu enklere
cursor = conn.cursor("my_cursor_name")
Detaljerne findes på http://initd.org/psycopg/docs/usage.html#server-side-cursors
Jeg fandt instruktionerne lidt forvirrende, da jeg selvom jeg skulle omskrive min SQL til at inkludere "DECLARE my_cursor_name ...." og derefter en "FETCH count 2000 FROM my_cursor_name", men det viser sig, at psycopg gør det hele for dig under emhætten, hvis du blot overskriver "name=None" standardparameteren, når du opretter en markør.
Forslaget ovenfor om at bruge fetchone eller fetchmany løser ikke problemet, da hvis du lader navneparameteren ikke indstilles, vil psycopg som standard forsøge at indlæse hele forespørgslen i ram. Den eneste anden ting, du muligvis skal (udover at angive en navneparameter) er at ændre cursor.itersize-attributten fra standard 2000 til at sige 1000, hvis du stadig har for lidt hukommelse.