解决用Python对Sqlite进行数据更新比较慢的一种方法
生活随笔
收集整理的這篇文章主要介紹了
解决用Python对Sqlite进行数据更新比较慢的一种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Background
在使用sqlite數據庫時,雖然數據庫以文件形式存在,并且基本ubuntu默認安裝sqlite數據庫,使用起來非常方便。
但是由于數據庫比較簡單,操作效率比較低。
非常明顯的就是數據更新,也就是update語句是非常非常非常慢!
(我不會告訴你我的一個百萬級的數據更新跑了3天還沒跑完。)
Method
代碼為:
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.692238Conclusion
使用這種方式,時間提升28.8%左右。(這么少?)
Reference
https://stackoverflow.com/questions/17867605/performance-of-insert-with-python-and-sqlite3
總結
以上是生活随笔為你收集整理的解决用Python对Sqlite进行数据更新比较慢的一种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MQ消息传输原理
- 下一篇: 一步步学习微软InfoPath2010和