Saya mengalami masalah yang sama dan setelah beberapa jam darah, keringat dan air mata, menemukan jawabannya hanya membutuhkan penambahan satu parameter.
Alih-alih
cursor = conn.cursor()
tulis
cursor = conn.cursor(name="my_cursor_name")
atau lebih sederhana lagi
cursor = conn.cursor("my_cursor_name")
Detailnya dapat ditemukan di http://initd.org/psycopg/docs/usage.html#server-side-cursors
Saya menemukan instruksinya sedikit membingungkan karena saya pikir saya perlu menulis ulang SQL saya untuk memasukkan "DECLARE my_cursor_name ...." dan kemudian "FETCH count 2000 FROM my_cursor_name" tetapi ternyata psycopg melakukan itu semua untuk Anda di bawah tudung jika Anda hanya menimpa parameter default "name=None" saat membuat kursor.
Saran di atas untuk menggunakan fetchone atau fetchmany tidak menyelesaikan masalah karena, jika Anda membiarkan parameter nama tidak disetel, psycopg akan secara default mencoba memuat seluruh kueri ke dalam ram. Satu-satunya hal lain yang mungkin perlu Anda lakukan (selain mendeklarasikan parameter nama) adalah mengubah atribut cursor.itersize dari default 2000 menjadi 1000 jika Anda masih memiliki terlalu sedikit memori.