Настройка производительности и использования 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 точно определил мою проблему. В комментариях он предлагает сначала сбросить данные в базу данных и распаковать их оттуда. К сожалению, я не мог понять, как реализовать свое предложение.Если у кого-то есть идея, как это сделать, его ответ будет с радостью принят.