我正在使用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行表中进行选择?
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)
会做的伎俩,但真的很难看.
有没有办法更直接地获得计数器的当前值?