You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用Python从PostgreSQL获取数据时运用chunksize功能

用Python分批从PostgreSQL获取大量数据

当你用fetchall()一次性拉取百万级甚至更大体量的数据时,会直接把所有数据加载到内存,轻则卡顿超时,重则直接内存溢出。用分批获取的方式就能解决这个问题,下面是基于psycopg2(Python连接PostgreSQL最常用的库)的具体实现:

方法1:用fetchmany()手动分批

直接通过fetchmany()指定每次获取的行数,循环直到取完所有数据:

import psycopg2

# 建立数据库连接
conn = psycopg2.connect(
    dbname="你的数据库名",
    user="用户名",
    password="密码",
    host="数据库地址"
)

# 创建游标
cur = conn.cursor()
# 执行查询语句
cur.execute("SELECT * FROM 你的大表;")

# 设置每次获取的行数(根据内存情况调整,比如1000、5000)
chunksize = 1000

while True:
    # 拉取当前批次的数据
    batch_rows = cur.fetchmany(chunksize)
    # 没有数据就退出循环
    if not batch_rows:
        break
    # 处理当前批次的数据(替换成你的业务逻辑)
    for row in batch_rows:
        # 示例:打印行数据,实际可写入文件、做数据分析等
        print(row)

# 关闭游标和连接
cur.close()
conn.close()

方法2:用itersize自动分批

psycopg2的游标支持itersize参数,设置后迭代游标时会自动按指定批次拉取数据,代码更简洁:

import psycopg2

conn = psycopg2.connect(
    dbname="你的数据库名",
    user="用户名",
    password="密码",
    host="数据库地址"
)

# 创建游标时指定itersize,底层自动按这个批次拉取数据
cur = conn.cursor(itersize=1000)
cur.execute("SELECT * FROM 你的大表;")

# 直接迭代游标,每次循环处理一行,底层自动分批加载
for row in cur:
    # 处理单条数据
    print(row)

cur.close()
conn.close()

注意事项

  • chunksize/itersize的数值需根据内存情况调整:数值太小会增加数据库交互次数拖慢速度;数值太大仍会占用过多内存,建议先测试1000、5000、10000这几个档位。
  • 只读查询可设置conn.autocommit = True,避免事务锁问题。
  • 处理完数据后务必关闭游标和连接,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Tushar Lohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:15:43