相关疑难解决方法(0)

大查询后psycopg2泄漏内存

我正在使用psycopg2(我升级到2.5版)在我的postgres数据库的python脚本中运行一个大型查询.查询完成后,我关闭光标和连接,甚至运行gc,但进程仍然消耗大量内存(确切地说是7.3gb).我错过了一个清理步骤吗?

import psycopg2
conn = psycopg2.connect("dbname='dbname' user='user' host='host'")
cursor = conn.cursor()
cursor.execute("""large query""")
rows = cursor.fetchall()
del rows
cursor.close()
conn.close()
import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2

18
推荐指数
3
解决办法
1万
查看次数

Psycopg2在大型选择查询中占用内存

我正在使用psycopg2查询Postgresql数据库并尝试处理大约380M行的表中的所有行.所有类型为整数的列只有3列(id1,id2,count).但是,当我在下面运行简单的select查询时,Python进程开始消耗越来越多的内存,直到它被操作系统杀死.

最小的工作示例(假设mydatabase存在并包含一个名为mytable的表):

import psycopg2
conn = psycopg2.connect("dbname=mydatabase")
cur = conn.cursor()
cur.execute("SELECT * FROM mytable;")
Run Code Online (Sandbox Code Playgroud)

此时程序开始消耗内存.

我看了一下,Postgresql进程表现良好.它使用了相当多的CPU,这很好,并且内存量非常有限.

我期待psycopg2返回迭代器而不尝试缓冲select中的所有结果.然后我可以cur.fetchone()反复使用来处理所有行.

那么,如何在不耗尽可用内存的情况下从380M行表中进行选择?

python postgresql psycopg2

15
推荐指数
2
解决办法
5825
查看次数

cursor.fetchmany与DECLARE BINARY CURSOR和FETCH

我不确定每种方法中最有效的是哪种,或者在技术上它们是否相同?

那是

cursor.execute("DECLARE super_cursor BINARY CURSOR FOR SELECT names FROM myTable")

while True:
cursor.execute("FETCH 1000 FROM super_cursor")
rows = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

如alecxe python postgres给出的答案所示, 我可以fetchall()一百万行吗?

相较于:

while True:
    results = cursor.fetchmany(1000)
    if not results:
        break
    for result in results:
        yield result
Run Code Online (Sandbox Code Playgroud)

应该使用psycopg2或DECLARE BINARY中指定的fetchmany。

我假设fetchmany和DECLARE BINARY都在数据库服务器端设置了一个临时表...客户端是Apache服务器。

我正在使用的网站会根据用户输入来计算数据库中数据的输入量...因此需要加载大量数据以进行模式匹配。

谢谢。

python postgresql psycopg2

5
推荐指数
1
解决办法
338
查看次数

标签 统计

postgresql ×3

psycopg2 ×3

python ×3