Se você estiver usando o psycopg2, você desejará usar um cursor nomeado, caso contrário, ele tentará ler todos os dados da consulta na memória de uma só vez.
cursor = conn.cursor("some_unique_name")
cursor.execute("SELECT aid FROM pgbench_accounts")
for record in cursor:
something(record)
Isso irá buscar os registros do servidor em lotes de 2000 (valor padrão de
itersize
) e, em seguida, distribua-os no loop, um de cada vez.