Ajuste del rendimiento de Postgresql y el uso de memoria en un flujo de trabajo de Python
Yo uso Postgresql 9.4 para una base de datos modelo. Mi mesa se ve algo así:
CREATE TABLE table1 (
sid INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('table1_sid_seq'::regclass),
col1 INT,
col2 INT,
col3 JSONB);
Mi flujo de trabajo de Python 2.7 a menudo se ve así:
curs.execute("SELECT sid, col1, col2 FROM table1")
data = curs.fetchall()
putback = []
for i in data:
result = do_something(i[1], i[2])
putback.append((sid, result))
del data
curs.execute("UPDATE table1
SET col3 = p.result
FROM unnest(%s) p(sid INT, result JSONB)
WHERE sid = p.sid", (putback,))
Esto generalmente funciona bastante bien y de manera eficiente. Sin embargo, para consultas grandes, el uso de la memoria Postgresql a veces irá por las nubes (> 50 GB) durante elUPDATE
OS X y creo que OS X lo está matando, porque obtengo elWARNING: terminating connection because of crash of another server process
. Mi Macbook Pro tiene 16 GB de RAM y la consulta en cuestión tiene 11 millones de líneas con cada una de aproximadamente 100 caracteres de datos para reescribir.
Mipostgresql.conf
:
default_statistics_target = 50
maintenance_work_mem = 512MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 4GB
work_mem = 256MB
wal_buffers = 16MB
checkpoint_segments = 128
shared_buffers = 1024MB
max_connections = 80
Entonces me pregunto
¿Por qué mi consulta consume a veces cantidades excesivas de RAM?¿Cómo puedo controlar el uso de la memoria y garantizar un buen rendimiento?¿Existe una buena guía o herramienta para ajustar Postgresql?Actualizar:
Estoy bastante seguro de que @wildplasser identificó mi problema. En los comentarios, sugiere volcar primero los datos en la base de datos y desempaquetarlos desde allí. Lamentablemente, no pude descubrir cómo implementar su propuesta.Si alguien tiene una idea de cómo hacerlo, su respuesta será aceptada con mucho gusto.