如何将20GB大CSV分块读取后写入PostgreSQL数据库?
分块写入大型CSV到PostgreSQL的实现方案
首先修正你代码里的小问题:导入pandas时要写成import pandas as pd,否则pd.read_csv会报错;循环语法需要加上for关键字,正确写法是for chunk in ...。
接下来直接上可运行的实现代码——pd.read_csv指定chunksize后返回的本身就是生成器迭代器,完全符合你的需求,不需要额外编写生成器逻辑,直接循环写入即可:
import pandas as pd from sqlalchemy import create_engine # 创建SQLAlchemy引擎,替换成你的PostgreSQL连接信息 engine = create_engine('postgresql://username:password@host:port/database_name') # 分块读取CSV并写入数据库 chunk_size = 10000 # 可根据内存情况调整,比如调到1万或10万 for chunk in pd.read_csv("test.csv", chunksize=chunk_size): chunk.to_sql( name='your_table_name', # 替换为目标数据库表名 con=engine, if_exists='append', # 追加模式,避免覆盖已有数据 index=False, # 不写入DataFrame的索引列 method='multi' # 可选:批量提交多行,提升写入速度 ) print(f"已完成{len(chunk)}条数据写入")
实用优化建议:
- 调整chunk_size:内存充足时调大该值,减少数据库交互次数,提升整体效率
- 指定数据类型:若CSV包含日期、特殊字符串等类型,提前用
dtype参数指定(如dtype={'date_col': 'datetime64[ns]'}),避免类型推断错误 - 临时关闭约束:若目标表已建好,写入前可临时关闭PostgreSQL的外键、唯一性约束(需对应权限),写完再恢复,能大幅提速
- 进阶批量写入:追求极致速度的话,可结合psycopg2的
copy_from方法,将chunk转为CSV字符串后批量导入,适合有一定基础后尝试
内容的提问来源于stack exchange,提问作者Will-Iam
相关产品推荐
相关产品推荐

