n10*_*000 6 python memory postgresql performance psycopg2
我使用Postgresql 9.4作为模型数据库.我的表看起来有点像这样:
CREATE TABLE table1 (
sid INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('table1_sid_seq'::regclass),
col1 INT,
col2 INT,
col3 JSONB);
Run Code Online (Sandbox Code Playgroud)
我的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,))
Run Code Online (Sandbox Code Playgroud)
这通常可以很好地有效地工作.但是,对于大型查询,Postgresql内存使用有时会在UPDATE
命令期间通过屋顶(> 50GB),我相信它正被OS X杀死,因为我得到了WARNING: terminating connection because of crash of another server process
.我的Macbook Pro有16GB的RAM,有问题的查询有11M行,每行大约有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
Run Code Online (Sandbox Code Playgroud)
所以我想知道
更新:
我很确定@wildplasser查明了我的问题.在评论中,他建议首先将数据转储到数据库中,然后从那里解压缩.不幸的是,我无法弄清楚如何实施他的提议.如果有人知道如何做到这一点,他们的答案将很乐意接受.
我的解决方法是使用此处putback
建议的简单函数进行切片:
def chunk(l, n):
n = max(1, n)
return [l[i:i + n] for i in range(0, len(l), n)]
Run Code Online (Sandbox Code Playgroud)
进而
for chunk in chunk(putback, 250000):
curs.execute("UPDATE table1
SET col3 = p.result
FROM unnest(%s) p(sid INT, result JSONB)
WHERE sid = p.sid", (chunk,))
Run Code Online (Sandbox Code Playgroud)
这是可行的,即保持内存占用受到检查,但不是很优雅,而且比我通常做的一次转储所有数据慢。
归档时间: |
|
查看次数: |
1002 次 |
最近记录: |