pyDAL一个python的ORM(终) pyDAL的一些性能优化

news/2024/11/15 4:58:59/

一、大批量插入数据

对于 大量数据插入时,虽然pyDAL也手册中有个方法:bulk_insert(),但是手册也说了,虽然方法上是一次可以多条数据,如果后端数据库是关系型数据库,他转换为SQL时它是一条一条的插入的,只有在NoSQL数据库时能提速bulk_insert()的用法如下,感兴趣的看看:

db.person.bulk_insert([{'name':'Alex','age':'11'}, {'name': 'John','age':'22'}, {'name': 'Tim','age':'33'}])

那后端是关系数据库时,有其他办法吗?答案是我们利用前面 我们提到:db.executesql()方法,直接用SQL,下面是例子,

1、目标:

MySQL数据库我们一次插入2000万的csv文件(普通PC是无法直接打开这么多行的数据文件的

2、解决思路:

(1)分块读取,分块插入,我们已知csv各列的名为:col1,col2,col3,我们每次读10万行,插入库10万行);

(2)使用db.executesql()方法,编写SQL批量插入语句

(3)特别注意:将你的数据库的单条语句的数据包大小适当调大。就mysql而言:

# 服务器接受的数据包的大小,在执行数据量较大的单条语句,如果超过了默认限制,就会报错,提示这个参数大小不足
max_allowed_packet=100M

3、MySQL批量插入数据语法:

INSERT INTO table_name (column1, column2,...) VALUES ("value1_1", "value1_2",...), ("value2_1", "value2_2", ...)......;

4、示例代码:

我们使用到了pandas库,pandas的read_csv()方法可以对非常方便的对大文件分块读取:

import pandas as pd
df_chunk = pd.read_csv('my.csv', chunksize=100000, iterator=True)
for chunk in df_chunk:insert_values = ''for row in range(0, chunk.shape[0]):insert_values += '("' + str(chunk.iloc[row,0]) + '","' + str(chunk.iloc[row,1]) + '","' + str(chunk.iloc[row,2]) + '"),'db.executesql('INSERT INTO my_table (col1,col2,col3) VALUES ' + insert_values[:- 1] + ';')db.commit()

二、对于结果集很大的查询做遍历循环iterselect

     如果我们要对一个查询结果集做遍历循环,且结果数据很大,例如:

for row in db(db.IMEI_table.IMEI.contains('666')).select():

.....

常规的上述写法,一定是先查询得到 完整的结果放在内存中,在做遍历循环,很吃内存,性能也低,针对这种情况,pyDAL提供了iterselect()方法,使用也很方便,如下:

for row in db(db.IMEI_table.IMEI.contains('666')).iterselect():

      ...

当数据量较大时,iterselect()不仅速度快,还节省内存:


http://www.ppmy.cn/news/1328404.html

相关文章

DDD系列 - 第9讲 实体、值对象

目录 引言一、实体1.1 数据库实体1.2 数据库实体 vs. DDD实体1.3 DDD实体的本质及其识别规则1.4 代码中如何定义实体二 、值对象2.1 值对象 vs. 附属属性2.2 值对象 vs. 实体2.3 代码中如何定义值对象2.4 何时使用值对象引言 之前我在《DDD系列 - 第4讲 从架构师的角度看待DDD…

springboot配置项动态刷新

文章目录 一,序言二,准备工作1. pom.xml引入组件2. 配置文件示例 三,自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四,yaml文件转换为java对象1. 无法使…

C++设计模式(李建忠)笔记4(完结)

C设计模式(李建忠) 本文是学习笔记,如有侵权,请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT:https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 总结23种设计模式…

清华大学计算机学科推荐学术会议和期刊列表——网络与信息安全

A类会议 这里仅列出A类会议 会议简称会议全程网址IEEE S&PIEEE Symposium on Security and Privacyhttp://dblp.uni-trier.de/db/conf/sp/NDSSISOC Network and Distributed System Security Symposiumhttp://dblp.uni-trier.de/db/conf/ndss/USENIX SecurityUsenix Secu…

1d 卷积网络笔记

目录 这个是1d 卷积网络合集: resnet1d的 这个是1d 卷积网络合集: https://github.com/StChenHaoGitHub/1D-deeplearning-model-pytorch/blob/main/ResNet50.py resnet1d的 https://github.com/hsd1503/resnet1d

php基础学习之常量

php常量的基本概念 常量是在程序运行中的一种不可改变的量(数据),常量一旦定义,通常不可改变(用户级别)。 php常量的定义形式 使用define函数:define("常量名字", 常量值);使用cons…

【设计模式】代理模式的实现方式与使用场景

1. 概述 代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对另一个对象的访问,代理对象在客户端和目标对象之间充当了中介的角色,客户端不再直接访问目标对象,而是通过代理对象间接访问目标对象。 那在中间加一层代理…

数据库安全-第一章 Mysql 安全基础-【web 环境搭建——LAMP-1】-LAMP LNMP 简介

文章目录 相关知识WEB 应用程序运作方式简介什么是 LAMP题目什么是 LNMP题目什么是 WNMP题目补充:HTTP 协议题目 相关知识 WEB 应用程序运作方式简介 WEB 的本意是蜘蛛网和网,在网页设计中称为网页。现广泛译作网络、互联网等技术领域。日常生活中用户…