Python psycopg2使用SimpleConnectionPool数据库连接池以及execute_batch批量插入数据

2023-11-18

有关快速插入大量数据到数据库的一个比较好的博文如下:Fastest Way to Load Data Into PostgreSQL Using Python 其中文末还有提到几种不同方式的对比,效率十分的震撼,可以看看

1. 连接池和批量插入示例代码如下

import psycopg2
import psycopg2.extras
from psycopg2.pool import SimpleConnectionPool
from contextlib import contextmanager

# 连接池初始化
postgresql_conn_pool = SimpleConnectionPool(5, 200,
        host=DATABASE_HOST,
        port=DATABASE_PORT,
        user=DATABASE_USERNAME,
        password=DATABASE_PASSWORD,
        database=DATABASE_NAME)

@contextmanager
def get_cursor():
    con = postgresql_conn_pool.getconn()
    # 默认就自动提交
    con.autocommit = True
    try:
        yield con.cursor()
        # 或设置手动提交 con.commit()
    finally:
        # 用完放回连接池
        self.postgresql_conn_pool.putconn(con)

def save_data(dict_list):
    """
    dict_list = [{"name":"lucy", "address":"shanghai"},
                 {"name":"mike", "address":"beijing"}]
    """
    with get_cursor() as cursor:
        # 批量插入
        psycopg2.extras.execute_batch(cursor, """
                                    INSERT INTO user(name,address) 
                                    VALUES
                                    (%(name)s, %(address)s)
                                """, dict_list)
    

2.使用时需要注意的问题

  • 不需要再使用executemany了,该方法的性能没有execute_batch好,还有更快的则是copy from
  • SimpleConnectionPool只支持单线程,如果是多线程使用线程池,请使用psycopg2.pool.ThreadedConnectionPool,参考官方链接如下psycopg2.pool - Connections pooling

3. 为什么批量就是快?

从我自己测试时,插入数据来说话,业务场景是,一条数据要保存到三张表里面,具体代码实现就不展示了。
相关数据如下:

  • 每秒钟74条数据
  • 批量,500条一次耗时大约在0.33s左右,即6.7s后才执行一次存储,(6.7 + 0.33) / 500 = 0.014s一条
  • 不批量,一次insert单条耗时约0.048s,500 x 0.048 = 24s

那毫无疑问,批量就是快

4. 批量时的n条数据作为一个批次,n取何值效率最高?

假设如下:

  • 每秒钟p条数据
  • 批量情况下,n条数据耗时a秒
  • 不批量,一次insert单条耗时约q秒

请问n值,如何效率最好?总而言之
n = 200, a = 0.126799, a/n = 0.00063
n = 500, a = 0.33, a/n = 0.00066
n = 1000, a=0.35, a/n = 0.00035

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python psycopg2使用SimpleConnectionPool数据库连接池以及execute_batch批量插入数据 的相关文章

随机推荐

  • 关于table的selectedRowKeys和selectedRows

    项目使用的组件库是antd 页面中有很多table 有的table有行前面的复选框 于是就有了selectedRowkeys和selectedRows的事 他们两个都是数组 selectedRowkeys存的是table的rowKey 也就
  • .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)

    选择自 playyuer 的 Blog Net C 实现支持断点续传多线程下载的 Http Web 客户端工具类 C DIY HttpWebClient Reflector 了一下 System Net WebClient 重载或增加了若干
  • 论文阅读-NOLANet多模态伪造检测

    一 论文信息 题目 Deepfake Video Detection Based on Spatial Spectral and Temporal Inconsistencies UsingMultimodal Deep Learning
  • SQL学习笔记——limit用法(limit使用一个参数,limit使用两个参数)

    Product表 limit语法 select lt 列名 gt lt 列名 gt from lt 表名 gt limit lt 参数值 gt select from product limit 3 product id product n
  • 第三方平台代微信公众号开发

    第三方平台代微信公众号开发流程 一 准备工作 微信开放平台相关 申请微信开放平台账号后 需前往微信开放平台 创建第三方平台 填写开发相关配置 填写授权流程相关配置 注意事项 授权发起页域名 为项目开发使用域名 调用公众号二维码授权页时 必须
  • test is not a function (js正则表达式匹配问题)

    js中正则表达式匹配时 如果使用test函数 就必须不带引号 并且必须是 定义的规则变量 test 要测试的string 定义变量规则不要带引号 会错误的 如果不使用test 使用match则可以带引号 var re 1 9 d 4 10
  • Android 组件逻辑漏洞漫谈

    前言 随着社会越来越重视安全性 各种防御性编程或者漏洞缓解措施逐渐被加到了操作系统中 比如代码签名 指针签名 地址随机化 隔离堆等等 许多常见的内存破坏漏洞在这些缓解措施之下往往很难进行稳定的利用 因此 攻击者们的目光也逐渐更多地投入到逻辑
  • QT4信号连接与QT5的区别

    QT4信号连接与QT5的区别 QT4信号与槽 1 申明槽函数必须增加public slots 2 SIGNAL SLOT 将函数转为字符串 不进行错误检查 connect中信号和槽需要增加SIGNAL 和SLOT 3 槽函数和信号一致 参数
  • 常用的表格正则验证 + 省份选择 JS JQ

    常用的表格正则验证 轮子 let receiverNameReg u4e00 u9fa5 2 6 reg 收货人姓名 let receiverName receiverName val 收货人姓名 let phoneNumberReg d
  • TCP的几个状态 SYN, FIN, ACK, PSH, RST, URG

    2019独角兽企业重金招聘Python工程师标准 gt gt gt TCP的几个状态对于我们分析所起的作用 在TCP层 有个FLAGS字段 这个字段有以下几个标识 SYN FIN ACK PSH RST URG 其中 对于我们日常的分析有用
  • 数据挖掘技术-绘制散点图

    绘制散点图 前置步骤 准备数据guomin npz 下载数据guomin npz到Linux本地的 course DataAnalyze data目录 绘制散点图 绘制2000 2017年各季度的国民生产总值散点图 如代码 41所示 代码
  • 【华为OD机试真题 JAVA】执行时长

    JS版 华为OD机试真题 JS 执行时长 标题 执行时长 时间限制 1秒 内存限制 262144K 语言限制 不限 为了充分发挥GPU算力 需要尽可能多的将任务交给GPU执行 现在有一个任务数组 数组元素表示在这1秒内新增的任务个数且每秒都
  • Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

    最近在编写Python脚本过程中遇到一个问题比较奇怪 Python脚本完全正常没问题 但执行总报错 AttributeError module object has no attribute xxx 这其实是 pyc文件存在问题 问题定位
  • #C++矩阵类的实现

    C 矩阵类的实现 环境 Win10 VS2017 最近老师布置一个简单的C 作业 实现一个矩阵类 并且实现矩阵运算 主要实现运算为矩阵的加 减 乘 除以及求行列式 伴随矩阵 代数余子式和逆矩阵等 在参考网上的一些前辈的代码后 写出了这些运算
  • 信号与系统复习题

    选择题 2分 题 1 频谱与时域的关系 时域压缩 频域展宽 时域有限 频域无限 2 填空题 20分 2分 空 1 冲击信号的性质 抽样性 尺度变换性 奇偶性 2 线性时不变的概念 线性 齐次性 输入夸大多少倍 输出扩大多少倍 可加性 相应的
  • HFP协议

    通话专题HFP协议学习总结 一 配置和角色 二 HFP的连接 2 1服务级连接建立 2 1 1 服务发现和RFCOMM的连接 2 1 2 支持的特性交换 2 1 3 codec协商 2 1 4 HF指示器 2 1 5 AG指示器 2 1 6
  • ctfshow 文件上传 web151~170

    目录 web151 web 152 web 153 web 154 web 155 web 156 web 157 159 web 160 web 161 web 162 163 web 164 web 165 web 166 web 16
  • STM32F030C8T6 多通道ADC采集

    void adc init void ADC InitTypeDef ADC InitStructure GPIO InitTypeDef GPIO InitStructure RCC ADCCLKConfig RCC ADCCLK PCL
  • 动态规划算法解决背包问题(Java实现)

    文章收藏的好句子 你在书本上花的任何时间 都会在某一个时刻给你回报 目录 1 动态规划算法的概述 2 背包问题 3 动态规划算法解决背包问题 3 1 不可重复装入商品 3 2 思路分析 1 动态规划算法的概述 1 动态规划算法的思想是 将大
  • Python psycopg2使用SimpleConnectionPool数据库连接池以及execute_batch批量插入数据

    有关快速插入大量数据到数据库的一个比较好的博文如下 Fastest Way to Load Data Into PostgreSQL Using Python 其中文末还有提到几种不同方式的对比 效率十分的震撼 可以看看 1 连接池和批量插