我正在使用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;")

此时,程序开始消耗内存.

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

我希望psycopg2返回一个迭代器,而不try 缓冲来自select的所有结果.然后我可以重复使用cur.fetchone()来处理所有行.

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

推荐答案

你可以用server side cursors.

cur = conn.cursor('cursor-name') # server side cursor
cur.itersize = 10000 # how much records to buffer on a client
cur.execute("SELECT * FROM mytable;")

Postgresql相关问答推荐

从子查询中的排序结果中获取前X行

Postgres BULK INSERT如何影响Debezium?

我需要一个变量来引用上周的星期五

如何将 SELECT 查询的结果插入表中?

Docker compose read connection reset by peer error on pipeline

PostgreSql maintenance_work_mem 在索引创建期间增加

Rails Migration 使用转换将字符串转换为整数

PostgreSQL 错误:42P01:relation "[Table]" does not exist

使用 ON CONFLICT 从 INSERT 返回行,无需更新

包含受先前 DELETE 影响的行数的变量?

Postgresql SERIAL 的工作方式是否不同?

如何使用 postgresql 中的存储过程将数据插入表中

为 Django Postgres 连接强制 SSL

将主键更改为自动递增

在 postgresql 中,如何在 jsonb 键上返回布尔值而不是字符串?

SqlAlchemy:多列的不同计数

在 Postgres 中显示关系、序列和函数的默认访问权限

PostGIS - 将多面体转换为单面体

PostgreSQL 字符串(255) 限制 - Rails、Ruby 和 Heroku

在 Postgres 9.0+ 中使用 PL/pgSQL 在表上循环