Postgresql-Leistung und Speichernutzung in einem Python-Workflow optimieren

Ich verwende Postgresql 9.4 für eine Modelldatenbank. Mein Tisch sieht ungefähr so aus:

CREATE TABLE table1 (
sid INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('table1_sid_seq'::regclass),
col1 INT, 
col2 INT,
col3 JSONB);

Mein Python 2.7-Workflow sieht oft so aus:

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,))

Das funktioniert normalerweise recht gut und effizient. Bei großen Abfragen wird der Postgresql-Speicher jedoch manchmal überlastet (> 50 GB), wennUPDATE Befehl und ich glaube, es wird von OS X getötet, weil ich die @ bekommWARNING: terminating connection because of crash of another server process. Mein Macbook Pro hat 16 GB RAM und die fragliche Abfrage hat 11 Millionen Zeilen mit jeweils etwa 100 Zeichen Daten, die zurückgeschrieben werden müssen.

Mypostgresql.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

Also ich frage mich,

Warum verbraucht meine Abfrage manchmal übermäßig viel RAM?Wie kann ich die Speichernutzung steuern und trotzdem eine gute Leistung garantieren? Gibt es eine gute Richtlinie oder ein gutes Tool zum Optimieren von Postgresql?

Aktualisiere:
Ich bin mir ziemlich sicher, dass @wildplasser mein Problem festgestellt hat. In den Kommentaren schlägt er vor, die Daten zuerst in die Datenbank zu kopieren und von dort aus zu entpacken. Leider konnte ich nicht herausfinden, wie ich seinen Vorschlag umsetzen sollte.Wenn jemand eine Idee hat, wie man das macht, wird seine Antwort gerne angenommen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage