当前位置: 首页 > news >正文

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

一、大批量插入数据

对于 大量数据插入时,虽然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()不仅速度快,还节省内存:

相关文章:

  • 【QT+QGIS跨平台编译】之二:【zlib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • Electron中苹果支付 Apple Pay inAppPurchase 内购支付
  • vue3中Fragment特性的一个bug,需要留意的注意事项
  • redis-exporter grafana面板配置
  • linux SSH/Telnet/Shell/CMD终端软件之WindTerm
  • 定时获取微博热搜数据
  • 《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型
  • 深度学习模型之yolov8实例分割模型TesorRT部署-python版本
  • Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统
  • c JPEG 1D DCT 优化1
  • Camera基础原理与畸变补偿
  • Webpack5入门到原理22:提升打包构建速度
  • EtherNet/IP开发:C++开发CIP源代码
  • 9-数组- 除自身以外数组的乘积
  • 开发实战角度:distinct实现原理及具体优化总结
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Bytom交易说明(账户管理模式)
  • CentOS 7 修改主机名
  • C学习-枚举(九)
  • es6要点
  • github指令
  • Java Agent 学习笔记
  • java 多线程基础, 我觉得还是有必要看看的
  • Java方法详解
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • PhantomJS 安装
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • webpack+react项目初体验——记录我的webpack环境配置
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 什么是Javascript函数节流?
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • (23)Linux的软硬连接
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (pytorch进阶之路)扩散概率模型
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (全注解开发)学习Spring-MVC的第三天
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)基于IDEA的JAVA基础10
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *1 计算机基础和操作系统基础及几大协议
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 材料检测系统崩溃分析
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET下ASPX编程的几个小问题
  • .NET正则基础之——正则委托
  • @ConditionalOnProperty注解使用说明
  • @RequestParam详解
  • @拔赤:Web前端开发十日谈
  • [100天算法】-实现 strStr()(day 52)
  • [20190113]四校联考
  • [ACTF2020 新生赛]Include
  • [Android] Amazon 的 android 音视频开发文档