如何在使用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
相关产品推荐
相关产品推荐

