Python Psycopg2在大型select查询上使用内存
我正在使用psycopg2查询Postgresql数据库,并尝试处理一个大约有380M行的表中的所有行。只有3列(id1、id2、count)全部为整型。然而,当我运行下面简单的select查询时,Python进程开始消耗越来越多的内存,直到被操作系统杀死 最简单的工作示例(假设mydatabase存在并包含一个名为mytable的表): 此时,程序开始消耗内存 我看了一下,Postgresql进程运行良好。它使用了相当多的CPU,这很好,而且内存非常有限 我希望psycopg2返回一个迭代器,而不尝试缓冲来自select的所有结果。然后我可以反复使用Python Psycopg2在大型select查询上使用内存,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在使用psycopg2查询Postgresql数据库,并尝试处理一个大约有380M行的表中的所有行。只有3列(id1、id2、count)全部为整型。然而,当我运行下面简单的select查询时,Python进程开始消耗越来越多的内存,直到被操作系统杀死 最简单的工作示例(假设mydatabase存在并包含一个名为mytable的表): 此时,程序开始消耗内存 我看了一下,Postgresql进程运行良好。它使用了相当多的CPU,这很好,而且内存非常有限 我希望psycopg2返回一个迭代器,
cur.fetchone()
来处理所有行
那么,如何在不耗尽可用内存的情况下从380M行表中进行选择?您可以使用
使用服务器端游标的另一种方法:
with psycopg2.connect(database_connection_string) as conn:
with conn.cursor(name='name_of_cursor') as cursor:
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row
Psycopg2将一次向客户端获取
itersize
行。一旦for
循环耗尽该批次,它将获取下一批。太好了,谢谢!我将做一些编辑来改进一下解释,然后接受。这个游标是存在于PostgreSQL server还是Python客户端中?为从mytable中选择*声明游标\u名称游标@在本例中,一切都是从Python客户端完成的。服务器端不存在游标。不,这是错误的。当您创建“命名游标”时,psycopg将在服务器端创建一个相应的游标,并为您进行管理。@fog:谢谢您提供的信息!
cur = conn.cursor('cursor-name') # server side cursor
cur.itersize = 10000 # how much records to buffer on a client
cur.execute("SELECT * FROM mytable;")
with psycopg2.connect(database_connection_string) as conn:
with conn.cursor(name='name_of_cursor') as cursor:
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row