Настройка производительности и использования Postgresql в рабочем процессе Python

Я использую Postgresql 9.4 для модельной базы данных. Моя таблица выглядит примерно так:

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

Мой рабочий процесс Python 2.7 часто выглядит так:

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

Это обычно работает довольно хорошо и эффективно. Тем не менее, для больших запросов использование памяти Postgresql будет иногда превышать (> 50 ГБ) во времяUPDATE команда, и я верю, что это убито OS X, потому что я получаюWARNING: terminating connection because of crash of another server process, Мой Macbook Pro имеет 16 ГБ оперативной памяти, а рассматриваемый запрос имеет 11 миллионов строк, каждая из которых содержит около 100 символов данных для обратной записи.

мойpostgresql.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

Так мне интересно

Почему мой запрос потребляет иногда слишком много оперативной памяти?Как я могу контролировать использование памяти и при этом гарантировать хорошую производительность?Есть ли хорошее руководство или инструмент для настройки Postgresql?

Обновить:
Я уверен, что @wildplasser точно определил мою проблему. В комментариях он предлагает сначала сбросить данные в базу данных и распаковать их оттуда. К сожалению, я не мог понять, как реализовать свое предложение.Если у кого-то есть идея, как это сделать, его ответ будет с радостью принят.

Ответы на вопрос(0)

Ваш ответ на вопрос