大数据处理,Pandas与SQL高效读写大型数据集

大家好,使用Pandas和SQL高效地从数据库中读取、处理和写入大型数据集,以实现最佳性能和内存管理,这是十分重要的。

图片

处理大型数据集往往是一项挑战,特别是在涉及到从数据库读取和写入数据时。将整个数据集加载到内存中的传统方法可能会导致系统崩溃和处理时间缓慢。

本文将探讨一种更好的解决方案:简化分块读写数据的过程。这种技术能够高效地处理大量数据,对于任何与数据库和数据帧一起工作的人来说都是一种宝贵的工具。我们将重点使用流行的数据分析库Pandas来演示如何从数据库表中读取大量数据,并将其分块写入Pandas数据帧,以及如何将大型数据从数据帧写回数据库。

一. 简化从数据库表中分块读取大型数据集的过程

在处理存储在数据库中的大量数据时,以高效和可管理的方式处理数据非常重要。Pandas中的pd.read_sql()函数提供了一种方便的解决方案,可以将数据从数据库表中读取到Pandas DataFrame中。通过添加chunksize参数,可以控制每次加载到内存中的行数,从而使我们能够以可管理的块处理数据,并根据需要对其进行操作。本文将重点介绍如何使用Pandas从Postgres数据库中读取大型数据集。

engine = create_engine(
      "postgresql+psycopg2://db_username:db_password@db_host:db_port/db_name")

conn = engine.connect().execution_options(stream_results=True)

for chunk_dataframe in pd.read_sql("SELECT * FROM schema.table_name", conn, 
                                    chunksize=50000):
    print(f"Dataframe with {len(chunk_dataframe)} rows")
    # ...对数据帧做一些事情(计算/操作)...

在上面的代码中:

  • 使用SQLAlchemy库中的create_engine()方法创建了一个SQLAlchemy引擎。

  • 使用stream_results=True创建了一个到PostgreSQL数据库的连接。稍后详细介绍。

  • 然后,将此连接与从表中选择所有行的SQL查询一起传递给pd.read_sql()函数。

  • 还指定了chunksize为50000行,这意味着pd.read_sql()函数每次返回一个包含50000行的新DataFrame。

  • 然后,可以使用for循环迭代pd.read_sql()函数返回的数据块。

  • 在此示例中,只是打印每个数据块中的行数,但在真实场景中,可能会在处理下一个数据块之前对每个数据块进行一些额外的处理。

stream_results:在SQLAlchemy中,当执行查询时,通常会将结果一次性加载到内存中。当处理大型结果集时,这可能会导致效率低下,因为它需要大量的内存。当启用stream_results(设置为True)时,查询会返回一个游标,并在需要时获取结果集的每一行,从而减少内存使用量。这在处理大型结果集时特别有用,否则会占用大量内存。

二. 将大型数据集写入数据库表

在处理数据后,可能需要将其写回数据库表。虽然Pandas提供的to_sql()方法是一种方便的方法,但对于写入大量数据来说可能不是最高效的方法。我们将使用to_sql()method参数。这时就要用到COPY方法。

COPY方法被广泛认为是将数据插入SQL数据库的最快方法之一。SQL中的COPY语句用于将大量数据快速加载到表中,或将数据从文件导出到表中。COPY语句的基本语法简单明了,可以轻松地将大量数据快速插入到数据库表中。

COPY [table_name] ([column1, column2, ...]) FROM [file_path] [WITH (options)]

本文将探讨COPY方法,以及它如何能够高效地将大量数据写入数据库表。无论处理的是少量数据还是大量数据,COPY方法都是一个可以快速、高效地将数据写入数据库的有用工具。

在Python中,一种方法是将数据帧存储在文件中,然后使用上述查询快速批量插入数据。但是大多数情况下并不希望创建文件,因此我们将使用缓冲对象。

注意:此方法仅适用于支持COPY FROM方法的数据库。

import csv
from io import StringIO

def copy_insert(table, conn, keys, data_iter):
    # 获取提供游标的DBAPI连接
    dbapi_conn = conn.connection
    with dbapi_conn.cursor() as cur:
        string_buffer = StringIO()
        writer = csv.writer(string_buffer)
        writer.writerows(data_iter)
        string_buffer.seek(0)

        columns = ', '.join(['"{}"'.format(k) for k in keys])
        if table.schema:
            table_name = '{}.{}'.format(table.schema, table.name)
        else:
            table_name = table.name

        sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(
            table_name, columns)
        cur.copy_expert(sql=sql, file=string_buffer)

现在来解读一下上面的代码:

1. copy_insert函数是一个实用函数,使用COPY FROM方法将数据插入数据库表中,这是一种比标准INSERT语句更快的插入数据方法。

2. 该函数需要四个参数:

  • table是代表数据库中表的pandas.io.sql.SQLTable对象。

  • conn是连接到数据库的SQLAlchemy连接对象。

  • keys是列名列表。

  • data_iter是提供要插入的值的可迭代对象。

3. 该函数首先从SQLAlchemy连接对象获取一个DBAPI连接,并创建一个游标。

4. 然后,将要插入的值以CSV文件的形式写入到StringIO缓冲区中,并将其传递给游标的copy_expert方法。

 copy_expert方法用于执行COPY语句,将CSV文件中的数据插入数据库表中。table_name变量可以通过使用模式名称和表名称或仅使用表名称来构造,这取决于表是否定义了模式(例如,MySQL没有模式,而PostgreSQL有模式)。

5. 使用SQL参数执行COPY语句,并将文件缓冲区作为文件参数插入数据到数据库中。

为了插入数据,将使用SQLAlchemy的基本方法:

df.to_sql(name="table_name", schema="schema_name", con=engine, if_exists="append", index=False, method=copy_insert)
  • name:数据库中表格的名称。

  • schema:表所属数据库模式的名称。

  • con:SQLAlchemy引擎对象,表示与数据库的连接。

  • if_exists:一个字符串,用于指定如果表已经存在时的行为,在本例中为"append"。使用"append"时,新行将被添加到现有表中。

  • index:一个布尔值,指定是否将DataFrame索引作为表中的单独列写入,本例中为False

  • method:一个字符串,用于指定向表中写入数据的方法。我们将使用前面定义的copy_insert

接下来,数据将快速、高效地插入数据库表中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【第十六课】哈希表(acwing-840模拟散列表 / 拉链法 / 开放寻址法 / c++代码 )

目录 前言 哈希表思想 拉链法 开放寻址法 acwing-840模拟散列表 拉链法代码如下 开放寻址法代码 前言 我对哈希表的印象就是:感觉可以类比数组,像数组的下标和该下标所对的元素之间的关系一样,就是比如ha[0]1,那么我下标为…

mask transformer相关论文阅读

前面讲了mask-transformer对医学图像分割任务是非常适用的。本文就是总结一些近期看过的mask-transformer方面的论文。 因为不知道mask transformer是什么就看了一些论文。后来得出结论,应该就是生成mask的transformer就是mask transformer。 DETR 很多这些论文都…

机器学习 | 掌握Matplotlib的可视化图表操作

Matplotlib是python的一个数据可视化库,用于创建静态、动态和交互式图表。它可以制作多种类型的图表,如折线图、散点图、柱状图、饼图、直方图、3D 图形等。以渐进、交互式方式实现数据可视化。当然博主也不能面面俱到的讲解到所有内容,详情请…

新特性Record最全用法总结---动力节点总结

目录 0、有用的新特性 一、Record 1.1、Record的介绍: 1.2、Record的声明: 1.3、Record的创建: 1.4、Record使用举例: 1.5、Record-实例方法、静态方法 1.6、Record-三类构造方法 1.6.1、紧凑型构造、定制构造方法&#…

MySQL的启动与连接

一、启动MySQL服务 方式一:进入计算机管理界面,点击【服务】,找到【MYSQL80】,右键开启即可 方式二:以管理员身份打开powershell, 输入命令net start MYSQL80. 二、连接MySQL服务 进入MySQL的安装目录中的bin目录&a…

【jetson笔记】torchaudio报错

原因是因为pip安装的包与jetson不兼容导致 自己安装或者cmake编译也会报错 需要拉取官方配置好的docker镜像 拉取docker镜像 具体容器可以看官网,按照自己需求拉取即可 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml 如果其他包不需要只需要torc…

Supplier 惰性调用和 Future#get 同步等待调用结合

📖一、背景介绍 关于任务异步执行,两个点不可避免:异步结果和异步回调。 而在我的工程中有这样一段代码:使用 CompletableFuture 进行封装,可以异步执行,异步回调,通过 get() 等待异步任务的结…

ArcEngine添加点要素、线要素、面要素及学习总结

基于C#的ArcEngine二次开发教程(13):点、线、面要素的绘制_arcengine onmousedown-CSDN博客 https://www.cnblogs.com/cannel/p/11074343.html ArcEngine绘制点、线、多边形、矩形、圆形、椭圆的代码_arcengine 开发 生成矩形-CSDN博客 https…

《数学之友》期刊投稿方式投稿邮箱

《数学之友》是国家新闻出版总署批准的正规期刊,设置的栏目主要有:数学教育、教材研究、教学研究、数学建模、思想方法、数学学习、解题探索、CAI专题、复习考试、错例剖析等。从解题技巧方法、数学问题的溯源探微释疑到新课程背景下的教改教法教案&…

Qt事件处理,提升组件类

1.相关说明 1.提升组件QLabel的类&#xff0c;以实现双击功能 2.监控键盘事件&#xff0c;实现上下左右移动 3.鼠标点击获取坐标 2.相关界面 3.相关代码和操作 自定义类TMyLabel&#xff0c;父类为QLabel tmylabel.h #ifndef TMYLABEL_H #define TMYLABEL_H #include <QL…

thinkphp+vue+mysql旅游推荐攻略分享网站p0667

基于php语言设计并实现了旅游分享网站。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用thinkphp框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、景点信息、攻略分类、旅游攻略、门票购买、留言反馈、论坛管理、系统管理等功能模块。运行环境:phpstudy/wa…

CSC7225

CSC7225 为高性能电流模式 PWM 开关电源控制器&#xff0c;满足绿色环保标准&#xff1b;广泛适用于经济型开关电源&#xff0c;如 DVD、机顶盒、传真机、打印机、LCD 显示器等。CSC7225 采用 DIP-8 封装。 CSC7225主要特点  CSC7225内置 700V 高压功率开关管&#xff0c;外…

解读人工智能:AI时代的奇迹与担忧

随着科技的迅猛发展&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;逐渐进入人们的视野。那么&#xff0c;什么是人工智能呢&#xff1f;简单来说&#xff0c;它是一种模拟人类智能的技术&#xff0c;通过计算机系统实现人类所具备的思…

GBASE南大通用数据库GBase 8s常见问题解析 -- 查找锁会话并解锁

本文摘自GBASE南大通用社区&#xff0c;by&#xff1a;wty&#xff0c;原文请点击&#xff1a;GBase 8s常见问题 -- 查找锁会话并解锁|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 问题现象 执行SQL时报错 244: Could not do…

6.PR-AUC机器学习模型性能的常用的评估指标

PR-AUC PR-AUC&#xff0c;即精确率-召回率曲线下的面积&#xff0c;是一种用于评估分类模型性能的指标。与ROC-AUC&#xff08;接收者操作特征曲线下的面积&#xff09;不同&#xff0c;PR-AUC关注的是精确率和召回率之间的关系&#xff0c;特别适用于不平衡数据集。 精确率…

【大数据】YARN调度器及调度策略

YARN调度器 YARN负责作业资源调度&#xff0c;在集群中找到满足业务的资源&#xff0c;帮助作业启动任务&#xff0c;管理作业的生命周期。 ​ YARN技术架构 ​ 目前&#xff0c;Hadoop作业调度器主要有三种&#xff1a;先进先出调度器&#xff08;First In First Out&…

雪花算法生成ID【细糠】

目录 &#x1f9c2;1.ID生成规则 &#x1f953;2.UUID &#x1f32d;3.数据库自增主键 &#x1f37f;4.雪花算法 1.ID生成规则 1. 全局唯一2.趋势递增3.单调递增4.信息安全5.含时间戳 2.UUID UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字…

Windows和Linux访问不了GitHub的解决方法

一、Windows访问不了GitHub 问题描述 使用Windows访问GitHub时&#xff0c;出现如下情况&#xff0c;显示无法访问。 解决方案&#xff1a; 打开域名查询网站&#xff1a;https://tool.chinaz.com/dns 输入GitHub的域名&#xff0c;点击立即检测。 出现如下页面&#xff0c…

【51单片机】点亮第一个LED灯

目录 点亮第一个LED灯单片机 GPIO 介绍GPIO 概念GPIO 结构 LED简介软件设计点亮D1指示灯LED流水灯 橙色 点亮第一个LED灯 单片机 GPIO 介绍 GPIO 概念 GPIO&#xff08;general purpose intput output&#xff09; 是通用输入输出端口的简称&#xff0c; 可以通过软件来控制…

泥石流监测识别摄像机

泥石流监测识别摄像机是一种基于图像识别技术的监测设备&#xff0c;主要用于实时监测和识别泥石流的发生和演变过程&#xff0c;以预警和减灾为目的。这种摄像机通常采用高清晰度摄像头和图像处理系统&#xff0c;能够实时拍摄泥石流事件&#xff0c;并对图像进行处理和分析&a…