Peewee系列:
Peewee 使用
Peewee使用之事務(wù)
Peewee批量插入數(shù)據(jù)
Peewee 使用(二)——增刪改查更詳細(xì)使用
最近侵续,需要同步數(shù)據(jù)到Mysql中倔丈,數(shù)據(jù)量有幾百萬。但是状蜗,自己寫一個for循環(huán)需五,然后使用Model.create()
添加,發(fā)現(xiàn)這種方式特別慢轧坎。難道宏邮,像去年爬數(shù)據(jù)一樣,將幾百萬的數(shù)據(jù)從Redis取出來缸血,然后使用多線程進(jìn)行保存蜜氨?
在Google上搜索了之后,找到一種更簡單的方式捎泻,那就是使用Peewee原生的方法insert_many()
飒炎,進(jìn)行批量數(shù)據(jù)插入。
那么笆豁,它的速度有多快郎汪?
下面,是我簡單的比較了插入10000條數(shù)據(jù)到本地?cái)?shù)據(jù)庫中闯狱,四種方式所需要的時(shí)間煞赢。
第一種,for循環(huán)和Model.create()
代碼如下:
from xModels import XUser, database
import time
NUM = 10000
start_time = time.time()
users = []
for i in range(NUM):
XUser.create(phone='13847374833', password='123456')
print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))
結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 10.5秒
第二種哄孤,for循環(huán)和Model.create()照筑,并放入事務(wù)中
代碼如下:
from xModels import XUser, database
import time
NUM = 10000
start_time = time.time()
with database.atomic():
for i in range(NUM):
XUser.create(phone='13847374833', password='123456')
print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))
結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 4.94秒
第三種,使用原生的insert_many()方法
from xModels import XUser, database
import time
NUM = 10000
data = [{
'phone': '13847374833',
'password': '123456'
} for i in range(NUM)]
start_time = time.time()
for i in range(0, NUM, 100):
XUser.insert_many(data[i:i + 100]).execute()
print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))
結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 0.505秒
第四種瘦陈,使用原生的insert_many()方法凝危,并放入事務(wù)中
from xModels import XUser, database
import time
NUM = 10000
data = [{
'phone': '13847374833',
'password': '123456'
} for i in range(NUM)]
start_time = time.time()
with database.atomic():
for i in range(0, NUM, 100):
# 每次批量插入100條,分成多次插入
XUser.insert_many(data[i:i + 100]).execute()
print("插入{}條數(shù)據(jù), 花費(fèi): {:.3}秒".format(NUM, time.time()-start_time))
結(jié)果:插入10000條數(shù)據(jù), 花費(fèi): 0.401秒
結(jié)論
-
insert_many()
比使用for+Model.create()方式快很多晨逝,在上面例子中快了十倍不止 - 使用事務(wù)媒抠,可以些許提升