小编Car*_*arl的帖子

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
查看次数

Python itertools计数器的当前值是什么

itertools.countPython(2.7.9)中的计数器对于线程安全计数非常方便.我怎样才能获得计数器的当前值?

计数器递增并在每次调用时返回最后一个值next():

import itertools
x = itertools.count()
print x.next()  # 0
print x.next()  # 1
print x.next()  # 2
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

我没有办法在没有调用的情况下获得计数器的当前值next(),这会产生增加计数器或使用repr()函数的不良副作用.

继上述内容之后:

print repr(x)  # "count(3)"
Run Code Online (Sandbox Code Playgroud)

所以你可以解析输出repr().就像是

current_value = int(repr(x)[6:-1])
Run Code Online (Sandbox Code Playgroud)

会做的伎俩,但真的很难看.

有没有办法更直接地获得计数器的当前值?

python python-itertools

8
推荐指数
2
解决办法
2295
查看次数

标签 统计

python ×2

postgresql ×1

psycopg2 ×1

python-itertools ×1