大数据处理,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 StringIOdef copy_insert(table, conn, keys, data_iter):# 获取提供游标的DBAPI连接dbapi_conn = conn.connectionwith 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.namesql = '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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antdesignvue中使用VNode写法

1、使用场景 如图:消息提示框中,将数据中的数据单独一行显示 2、代码 let errorList res.result; //后端返回的数据例: ["1. 数据格式不正确","2. 数据已存在"]if(errorList&&errorList.length!0){this.$notif…

k8s的图形化工具---rancher

声明式:yaml文件 陈述式:命令行 k8s的图形化工具---rancher racher是一个开源的企业级多集群的k8s关联平台。 rancher和k8s区别: 都是为了容器的调度和编排系统,但是rancher不仅能调度,还能管理k8s集群&#xff0…

mac电脑安卓文件传输工具:Android File Transfer直装版

Android File Transfer(AFT)是一款用于在Mac操作系统上与Android设备之间传输文件。它允许用户将照片、音乐、视频和其他文件从他们的Android手机或平板电脑传输到Mac电脑,以及将文件从Mac上传到Android设备。 下载地址:https://w…

Unity New Input System 及其系统结构和源码浅析【Unity学习笔记·第十二】

转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/132534422 作者:CSDN|Ringleader| 主要参考: 官方文档:Unity官方Input System手册与API官方测试用例:Unity-Technologies/InputS…

【项目日记(四)】第一层: 线程缓存的具体实现

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你做项目   🔝🔝 开发环境: Visual Studio 2022 项目日…

CC工具箱使用指南:【Excel导出图片】

一、简介 这是一个有点娱乐向的小工具。作用就是将Excel的内容导出成一个JPG图片,目前只针对Excel中的第一个sheet表。 说不出来实际作用在哪里,不过把一个长表快速导出图片,有时候也挺有意思,有兴趣可以试试。 二、工具参数介绍…

MySQL-进阶-索引

一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree(多路平衡查找树) 2、BTree 3、Hash 三、索引分类 四、索引语法 1、语法 2、案例 五、SQL性能分析 1、查看执行频次 2、慢查询日志 3、show-profile 4、explain

【目标跟踪】多相机环视跟踪

文章目录 一、前言二、流程图三、实现原理3.1、初始化3.2、输入3.3、初始航迹3.4、航迹预测3.5、航迹匹配3.6、输出结果 四、c 代码五、总结 一、前言 多相机目标跟踪主要是为了实现 360 度跟踪。单相机检测存在左右后的盲区视野。在智能驾驶领域,要想靠相机实现无…

新能源、新智造、新技术、新未来2024上海国际氢能产业展览会7月魔都开展!

氢能作为一种来源丰富、绿色低碳、应用广泛的二次能源,是实现可再生能源大规模消纳,电网大规模调峰和跨季节、跨地域储能的重要途径,对构建我国新型电力系统和实现碳达峰碳中和目标具有重要意义。 为落实国家关于发展氢能产业的决策部署&…

Springboot+vue的科研工作量管理系统的设计与实现(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的科研工作量管理系统的设计与实现(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的科研工作量管理系统的设计与实现…

首批!鸿蒙千帆起,生态全面启动

在近日举办的鸿蒙生态千帆启航仪式上,华为常务董事、终端BG CEO余承东表示,鸿蒙生态设备已经增至8亿 ,将打开万亿产业新蓝海。 在本次论坛上,华为宣布HarmonyOS NEXT鸿蒙星河版(开发者预览版)已面向开发者…

初识计算机网络 | 计算机网络的发展 | 协议初识

1.计算机网络的发展 “矛盾是普遍存在的,矛盾是事物联系的实质内容和事物发展的根本动力!” 计算机在诞生之初,在军事上用来计算导弹的弹道轨迹!在发展的过程中(商业的推动,国家政策推动)&…

NTFS 磁盘管理 :NTFS Disk by Omi NTFS

NTFS Disk by Omi NTFS是一款专为Mac系统设计的NTFS文件系统读写解决方案的工具。它可以帮助Mac用户方便地访问和管理NTFS格式的硬盘、U盘、移动硬盘以及其他存储设备,提供高效稳定的NTFS卷管理功能。 NTFS 磁盘管理 :NTFS Disk by Omi NTFS 该软件的主…

web项目开发的基本过程

一、背景 web项目开发基本过程一般由需求分析,概要设计,详细设计,数据库设计,编码,测试,发布上线这几个过程。这就是经典的瀑布模型。但是随着系统的复杂度越来越高,团队人员技术栈分工越来越小…

Vue2 - keep-alive 作用和原理

目录 1&#xff0c;介绍和作用2&#xff0c;原理3&#xff0c;使用场景3.1&#xff0c;效果展示3.2&#xff0c;实现思路 1&#xff0c;介绍和作用 <!-- 非活跃的组件将会被缓存&#xff01; --> <keep-alive><component :is"activeComponent" />…

[Tomcat] [从安装到关闭] MAC部署方式

安装Tomcat 官网下载&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloads 配置Tomcat 1、输入cd空格&#xff0c;打开Tomca目录&#xff0c;把bin文件夹直接拖拉到终端 2、授权bin目录下的所有操作&#xff1a;终端输入[sudo chmod 755 *.sh]&#xff0c;回车 …

JS进阶-解构赋值(一)

扩展&#xff1a;解构赋值时Js特有的一种处理数据的方式&#xff0c;在Java中没有处理数据的方式 知识引入&#xff1a; 思考&#xff1a;在js中&#xff0c;在没有学习解构赋值之前&#xff0c;我们是如何获取数组的内容的&#xff1f; 以上要么不好记忆&#xff0c;要么书写麻…

防御实验:(部分)

步骤一&#xff1a;了解前提&#xff1a; 1.1 题目要求&#xff1a; 需求一&#xff1a;DMZ区存在两台服务器&#xff0c;现在要求生产区的设备仅能在办公时间&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;访问&#xff0c;办公区的设备全天都可以访问。 需求二…

Kubernetes(K8S)各种攻击方法

1. 准备工作 1.1. metarget使用 项目地址(教程):https://github.com/Metarget/metarget/blob/master/README-zh.md 注意:推荐在Ubuntu 18.04(推荐)安装。 1.1.1. 安装metarget git clone https://github.com/Metarget/metarget.git cd metarget/ sudo apt install pyt…

Linux命令大全

文章目录 目录操作与文件管理系统信息与管理软件包管理和系统维护压缩与解压缩网络与通信辅助工具与信息获取文本处理与搜索时间与日期操作网络连接与通信&#xff08;补充&#xff09;链接管理磁盘与存储管理环境变量与路径设置用户和组管理查看系统信息 当然&#xff0c;以下…