我使用psycopg2(我升级到2.5版)在python脚本中对我的postgres数据库运行一个大型查询。查询完成后,我关闭游标和连接,甚至运行gc,但这个过程仍然消耗大量内存(确切地说是7.3gb)。我是否错过了清理步骤
导入psycopg2
conn=psycopg2.connect(“dbname=’dbname’user=’user’host=’host’”)
游标=连接游标()
cursor.execute(““大查询”)
rows=cursor.fetchall()
del rows
cursor.close()
康涅狄格州关闭
导入gc
gc.collect()
我遇到了一个类似的问题,经过几个小时的流血、流汗和流泪,我发现答案只需要添加一个参数
而不是
cursor=conn.cursor()
写
cursor=conn.cursor(name=“my\u cursor\u name”)
还是更简单
cursor=conn.cursor(“我的光标名称”)
详情载于http://initd.org/psycopg/docs/usage.html#server-侧光标
我发现指令有点混乱,因为我认为我需要重写SQL以包含
“DECLARE my_cursor_name…”和“FETCH count 2000 FROM my_cursor_name.”但事实证明,如果在创建光标时只覆盖“name=None”默认参数,psycopg就可以为您做到这一切
上面使用fetchone或fetchmany的建议并不能解决问题,因为如果您不设置name参数,psycopg将在默认情况下尝试将整个查询加载到ram中。除了声明名称参数外,您可能还需要将cursor.itersize属性从默认的2000更改为1000(如果内存仍然太少)