sql >> Base de Datos >  >> RDS >> PostgreSQL

psycopg2 pierde memoria después de una consulta grande

Me encontré con un problema similar y después de un par de horas de sangre, sudor y lágrimas, encontré que la respuesta simplemente requiere la adición de un parámetro.

En lugar de

cursor = conn.cursor()

escribe

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

o más simple aún

cursor = conn.cursor("my_cursor_name")

Los detalles se encuentran en http://initd.org/psycopg/docs/usage.html#server-side-cursors

Encontré las instrucciones un poco confusas porque pensé que tendría que reescribir mi SQL para incluir "DECLARE my_cursor_name ..." y luego "FETCH count 2000 FROM my_cursor_name" pero resulta que psycopg hace todo eso por ti bajo el capó si simplemente sobrescribe el parámetro predeterminado "name=None" al crear un cursor.

La sugerencia anterior de usar fetchone o fetchmany no resuelve el problema ya que, si deja el parámetro de nombre sin configurar, psycopg intentará por defecto cargar la consulta completa en RAM. Lo único que puede necesitar (además de declarar un parámetro de nombre) es cambiar el atributo cursor.itersize del valor predeterminado 2000 a decir 1000 si todavía tiene muy poca memoria.