Background

在使用sqlite数据库时,虽然数据库以文件形式存在,并且基本ubuntu默认安装sqlite数据库,使用起来非常方便。
但是由于数据库比较简单,操作效率比较低。
非常明显的就是数据更新,也就是update语句是非常非常非常慢!
(我不会告诉你我的一个百万级的数据更新跑了3天还没跑完。)

Method

  1. 关闭同步
  2. 显式开启事务
  3. COMMIT
    代码为:
def fastUpdate(sql, list_datas,db):'''sql: sqllist_datas:data list to update or insertdb : sqlite connection'''db.execute("PRAGMA synchronous=OFF") #关闭同步db.execute("BEGIN TRANSACTION") #显式开启事务cur = db.cursor()cur.executemany(sql, list_datas)db.execute("COMMIT") #COMMITcur.close()

Evaluation

相比普通的更新方式,分别更新500,000条数据,记录执行需要时间。

import sqlite3
from datetime import datetimedef fastUpdate(sql, list_datas,db):'''sql: sqllist_datas:data list to update or insertdb : sqlite connection'''db.execute("PRAGMA synchronous=OFF")db.execute("BEGIN TRANSACTION")cur = db.cursor()cur.executemany(sql, list_datas)db.execute("COMMIT")cur.close()def slowUpdate(sql, list_datas, db):'''sql: sqllist_datas:data list to update or insertdb : sqlite connection'''cur = db.cursor()cur.executemany(sql, list_datas)db.commit()cur.close()db = sqlite3.connect("test.sqlite")#data generation
To_Insert_data = []
for i in range(1000000):To_Insert_data.append((i, i+123,i))sql = "update test set id=?,num=? where id=?"t1 = datetime.now()
slowUpdate(sql, To_Insert_data[0:500000], db)
t2 = datetime.now()
print("Slow Op time: %s" % (t2-t1))t3 = datetime.now()
fastUpdate(sql, To_Insert_data[500000:], db)
t4 = datetime.now()
print("Fast Op time: %s" % (t4-t3))
db.close()

执行三次,时间统计为:

root@b26d5e2d88ae:/test# python FastInsertSqlite.py
Slow Op time: 0:00:02.372968
Fast Op time: 0:00:01.687531
root@b26d5e2d88ae:/test# python FastInsertSqlite.py
Slow Op time: 0:00:02.382283
Fast Op time: 0:00:01.508636
root@b26d5e2d88ae:/test# python FastInsertSqlite.py
Slow Op time: 0:00:02.371668
Fast Op time: 0:00:01.692238

Conclusion

使用这种方式,时间提升28.8%左右。(这么少?)

Reference

https://stackoverflow.com/questions/17867605/performance-of-insert-with-python-and-sqlite3

解决用Python对Sqlite进行数据更新比较慢的一种方法相关推荐

  1. 利用多线程解决多业务不同定时区间歇触发问题的一种方法

    利用多线程解决多业务不同定时区间歇触发问题的一种方法 参考文章: (1)利用多线程解决多业务不同定时区间歇触发问题的一种方法 (2)https://www.cnblogs.com/naaoveGIS/ ...

  2. 用python修改文件内容修改txt内容的3种方法

    用python修改文件内容修改txt内容的3种方法 方法一.修改原文件方式 def updateFile(file,old_str,new_str):"""替换文件中的字 ...

  3. Python实现从url中提取域名的几种方法

    这篇文章主要介绍了Python实现从url中提取域名的几种方法,本文给出了3种方法实现在URL中提取域名的需求,需要的朋友可以参考下. 从url中找到域名,首先想到的是用正则,然后寻找相应的类库.用正 ...

  4. 解决VMware中虚拟机(centos7)无法上网的一种方法

    解决VMware中虚拟机(centos7)无法上网的一种方法 参考文章: (1)解决VMware中虚拟机(centos7)无法上网的一种方法 (2)https://www.cnblogs.com/cu ...

  5. 解决“你当前无权访问该文件夹”问题的8种方法

    当我们使用计算机时,遇到的常见的数据结构之一应该是文件夹,我们通常只需单击两下即可访问全部文件.应用程序或信息.但是有时系统会提示"你当前无权访问该文件夹",然后无法访问该文件夹. ...

  6. Python计算程序运行时间秒级/毫秒级的两种方法datetime和time

    Python计算程序运行时间秒级/毫秒级的两种方法datetime和time 简单粗暴,先上代码: import datetime import time# 方法一:datetime.datetime ...

  7. mysql数据库最后一步卡住了_[数据库]解决MySQL安装到最后一步未响应的三种方法...

    [数据库]解决MySQL安装到最后一步未响应的三种方法 0 2018-07-13 01:01:27 这种情况一般是你以前安装过MySQL数据库服务项被占用了. 解决方法: 方法一:安装MySQL的时候 ...

  8. C语言函数怎么像python那样返回多个值?(三种方法:1、设置全局变量 2、传递指针 3、使用结构体返回不同类型的数据)

    引用文章:c语言函数可不可以返回多个值 文章目录 方法一:设置全局变量 例如:利用一个函数求出正方形的周长和面积. 方法二:使用数组名或指针作为函数的形参 实例2:编写函数求一维整形数组的最大值与最小 ...

  9. python字符串成熟编码_python字符串转公式两种方法获取网页编码python版

    在web开发的时候我们经常会遇到网页抓取和分析,各种语言都可以完成这个功能.我喜欢用python实现,因为python提供了很多成熟的模块,可以很方便的实现网页抓取. 但是在抓取过程中会遇到编码的问题 ...

最新文章

  1. 设置UTL_FILE_DIR参数 使得数据库使用OS文件
  2. VisualSVN Server 不能打开文件,系统找不到指定的文件
  3. java 添加图片背景_java添加背景图片
  4. 如何获取当前C#程序所有线程的调用栈信息 ?
  5. selenium框架安装及webdriver安装
  6. Python小练习2:pandas.Dataframe使用方法示例demo
  7. linux第三方模块参数,nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)...
  8. linux比较小数大小,带有小数点的数值对比大小
  9. STM32学习:按键控制LED
  10. Nginx正确记录post日志的方法
  11. java 修饰关键字_java——关键字以及修饰属性
  12. 使用微PE制作启动U盘重装系统教程
  13. 2020.9.28 爱客影视3.6.5-pro完整版搭建完毕带解析接口无广告
  14. 手机反编译java源码,Android反编译(一)之反编译JAVA源码
  15. 以太坊(ethereum)开发DApp应用的入门区块链技术教程
  16. 记录 FPGA加速器设计CNN(论文笔记)
  17. Winner-Take-All Autoencoders ( 赢者通吃自编码器)
  18. 小程序推荐——那些好用实用的小程序(图片类、资讯类、工具类)
  19. MSSQL 注入鄙见
  20. 什么是Web?Web Service、Web API傻傻分不清楚?

热门文章

  1. Python是什么?Python能干什么?一篇文章让你对Python了如指掌!!
  2. linux编译寻找包含的头文件,Linux编写内核模块编译时找不到头文件
  3. OpenCV傅立叶变换
  4. STM32----摸石头过河系列(二)
  5. Titanic(泰坦尼克号生存预测)---(1)
  6. Adobe illustrator 拼图模板制作 - 连载21
  7. Science发布基因组比对革新技术:泛基因组学映射工具Giraffe
  8. 当我们谈论生信的时候我们在谈什么
  9. rsync配置和使用
  10. 微信重大更新,mac版可刷朋友圈!可以看,可以评论! 支持M1