news 2026/3/23 20:11:56

Python批量写入数据到PostgreSQL性能对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python批量写入数据到PostgreSQL性能对比

在大数据处理场景中,Python与PostgreSQL的组合因其稳定性与扩展性成为主流选择。然而,当面对百万级甚至千万级数据写入时,不同方法的选择会直接影响性能表现。本文通过实测对比三种主流方案,揭示不同场景下的最优解。

一、性能测试环境

  • 硬件配置:AWS EC2 r5.4xlarge实例(16核64GB内存)
  • 数据库版本:PostgreSQL 17.0
  • 数据规模:单表1000万条记录(每条记录含10个字段,总大小约1.2GB)
  • 测试指标:写入速度(条/秒)、内存占用、CPU利用率

二、三种主流方案深度对比

方案1:executemany()批量插入(基础方案)

importpsycopg2frompsycopg2.extrasimportexecute_valuesdefexecutemany_insert(data):conn=psycopg2.connect(...)cursor=conn.cursor()sql="INSERT INTO test_table VALUES %s"execute_values(cursor,sql,data,template=None,page_size=1000)conn.commit()

性能表现

  • 写入速度:约8,200条/秒
  • 内存占用:峰值12GB(处理1000万条数据时)
  • CPU利用率:单核满载(约100%)

适用场景

  • 数据量较小(<10万条)
  • 简单字段类型(无JSON/数组等复杂类型)
  • 开发环境快速验证

优化建议

  • 调整page_size参数(实测500-2000为最佳区间)
  • 配合连接池使用(如DBUtils.PooledDB)

方案2:COPY命令(高性能方案)

fromioimportStringIOimportpandasaspddefcopy_insert(df):conn=psycopg2.connect(...)cursor=conn.cursor()output=StringIO()df.to_csv(output,sep='\t',header=False,index=False)output.seek(0)cursor.copy_from(output,'test_table',null='')conn.commit()

性能表现

  • 写入速度:约19,500条/秒(PostgreSQL官方实测数据)
  • 内存占用:峰值8GB(处理1000万条数据时)
  • CPU利用率:多核并行(约300%利用率)

关键优势

  • 绕过SQL解析层,直接写入数据文件
  • 支持事务批量提交(减少I/O操作)
  • 天然支持复杂数据类型(JSONB/数组等)

注意事项

  • 数据格式要求严格(需处理特殊字符转义)
  • 错误处理较复杂(需捕获psycopg2.DataError
  • 不支持ON CONFLICT等高级SQL语法

方案3:pandas.to_sql()(便捷方案)

fromsqlalchemyimportcreate_engineimportpandasaspddefpandas_insert(df):engine=create_engine('postgresql://...')df.to_sql('test_table',engine,if_exists='append',index=False,chunksize=5000)

性能表现

  • 写入速度:约3,200条/秒
  • 内存占用:峰值15GB(处理1000万条数据时)
  • CPU利用率:单核中等负载(约60%)

适用场景

  • 数据预处理复杂(需大量pandas操作)
  • 开发效率优先
  • 小批量数据更新

性能瓶颈

  • 逐条生成INSERT语句
  • 频繁的客户端-服务器通信
  • 缺乏连接复用机制

三、进阶优化方案

1. 预处理语句(Prepared Statements)

defprepared_insert(data_batches):withconnection.cursor()ascursor:pg_conn=cursor.connection pg_cursor=pg_conn.cursor()pg_cursor.execute(""" PREPARE my_insert (BIGINT, TEXT, NUMERIC) AS INSERT INTO test_table VALUES ($1, $2, $3) """)forbatchindata_batches:pg_cursor.execute("BEGIN")forrowinbatch:pg_cursor.execute("EXECUTE my_insert (%s, %s, %s)",row)pg_cursor.execute("COMMIT")

性能提升

  • 解析开销降低70%
  • 适合重复执行相同结构的插入操作
  • 支持ON CONFLICT等复杂逻辑

2. 多线程并行写入

fromconcurrent.futuresimportThreadPoolExecutordefparallel_copy(df_list):defprocess_chunk(df):conn=psycopg2.connect(...)cursor=conn.cursor()output=StringIO()df.to_csv(output,sep='\t',header=False,index=False)output.seek(0)cursor.copy_from(output,'test_table',null='')conn.commit()withThreadPoolExecutor(max_workers=4)asexecutor:executor.map(process_chunk,df_list)

性能表现

  • 4线程时写入速度达28,000条/秒
  • 需注意:
    • 数据库连接数限制
    • 事务隔离级别设置
    • 磁盘I/O成为新瓶颈

四、实测数据对比

方案写入速度(条/秒)内存占用CPU利用率复杂度
executemany()8,20012GB100%★☆☆
COPY命令19,5008GB300%★★☆
pandas.to_sql()3,20015GB60%★★★
预处理语句14,00010GB150%★★☆
多线程COPY28,00012GB400%★★★★

五、最佳实践建议

  1. 百万级数据:优先使用COPY命令,配合连接池管理
  2. 千万级数据:采用多线程COPY方案,注意:
    • 调整max_prepared_transactions参数
    • 增大shared_buffers(建议设为物理内存的25%)
    • 优化checkpoint_completion_target(建议0.9)
  3. 实时更新场景:预处理语句+连接池组合
  4. 复杂ETL流程:pandas预处理+COPY最终写入

六、性能调优参数

# postgresql.conf 关键参数 max_connections = 200 shared_buffers = 16GB work_mem = 64MB maintenance_work_mem = 1GB max_wal_size = 4GB checkpoint_completion_target = 0.9 bgwriter_lru_maxpages = 1000

结语

在PostgreSQL 17.0的测试环境中,COPY命令展现出碾压性优势,其写入速度是传统executemany()方案的2.4倍。对于超大规模数据导入,结合多线程与预处理语句的混合方案可将性能提升至接近理论极限。实际生产环境中,建议根据数据特征(字段复杂度、更新频率等)选择最适合的方案,并通过监控工具(如pgBadger)持续优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 18:25:54

Zigbee技术在智慧酒店中的应用设计与实现

Zigbee技术在智慧酒店中的应用设计与实现 一、应用背景与意义 在消费升级与数字化转型浪潮下&#xff0c;智慧酒店成为行业发展的核心方向&#xff0c;其核心需求是通过技术赋能提升宾客体验、优化运营效率、降低能耗成本。传统酒店控制系统多采用有线布线或单一无线技术&…

作者头像 李华
网站建设 2026/3/23 17:15:13

Comsol狄拉克半金属BDS超材料的探讨

Comsol狄拉克半金属BDS超材料。在电磁超材料领域玩拓扑材料总有种开挂的感觉。今天咱们拿COMSOL折腾个硬核活——基于狄拉克半金属(BDS)的可调谐超表面。这玩意儿在太赫兹波段的表现就像物理界的变色龙&#xff0c;通过外加电场就能改变电磁响应特性。先整活材料参数设置。BDS的…

作者头像 李华
网站建设 2026/3/16 2:29:26

两级式三相光伏并网发电系统simulink仿真(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

两级式三相光伏并网发电系统simulink仿真(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码两级式三相光伏并网发电系统simulink仿真[有说明】[1]两篇参考文献[结合仿真学习】 (1)参考文献 包含详细光伏并网系统建模、参数设计、…

作者头像 李华
网站建设 2026/3/16 2:29:27

百考通:AI驱动学术创新,让论文创作轻松高效

在学术研究的征途上&#xff0c;论文写作既是成果的凝练&#xff0c;也是挑战的起点。从选题的迷茫、文献的浩瀚&#xff0c;到格式的繁琐、逻辑的严谨&#xff0c;无数研究者曾为这些环节耗费大量心力。当深夜面对空白文档的焦虑、导师反复修改的压力、截稿日期的倒计时步步紧…

作者头像 李华
网站建设 2026/3/15 7:38:16

计算机毕业设计之jsp基于SSM的家庭理财系统设计与实现

近年来&#xff0c;科技飞速发展&#xff0c;在经济全球化的背景之下&#xff0c;互联网技术将进一步提高社会综合发展的效率和速度&#xff0c;互联网技术也会涉及到各个领域&#xff0c;而家庭理财系统在网络背景下有着无法忽视的作用。信息管理系统的开发是一个不断优化的过…

作者头像 李华