Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Psycopg2在大型select查询上使用内存_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python 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返回一个迭代器,

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

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

此时,程序开始消耗内存

我看了一下,Postgresql进程运行良好。它使用了相当多的CPU,这很好,而且内存非常有限

我希望psycopg2返回一个迭代器,而不尝试缓冲来自select的所有结果。然后我可以反复使用
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