Peewee批量插入数据


最近,需要同步数据到Mysql中,数据量有几百万。但是,自己写一个for循环,然后使用Model.create()添加,发现这种方式特别慢。难道,像去年爬数据一样,将几百万的数据从Redis取出来,然后使用多线程进行保存?

在Google上搜索了之后,找到一种更简单的方式,那就是使用Peewee原生的方法insert_many(),进行批量数据插入。

那么,它的速度有多快?

下面,是我简单的比较了插入10000条数据到本地数据库中,四种方式所需要的时间。

1、使用循环和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("插入{}条数据, 花费: {:.3}秒".format(NUM, time.time()-start_time))

结果:插入10000条数据, 花费: 10.5秒

2、事务中使用循环和Model.create()

代码如下:

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("插入{}条数据, 花费: {:.3}秒".format(NUM, time.time()-start_time))

结果:插入10000条数据, 花费: 4.94秒

3、使用原生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("插入{}条数据, 花费: {:.3}秒".format(NUM, time.time()-start_time))

结果:插入10000条数据, 花费: 0.505秒

4、事务中使用原生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()

with database.atomic():
    for i in range(0, NUM, 100):
        # 每次批量插入100条,分成多次插入
        XUser.insert_many(data[i:i + 100]).execute()

print("插入{}条数据, 花费: {:.3}秒".format(NUM, time.time()-start_time))

结果:插入10000条数据, 花费: 0.401秒

结论

  • insert_many()比使用for+Model.create()方式快很多,在上面例子中快了十倍不止
  • 使用事务,可以些许提升

参考:Python中peewee模块



作者:liuchungui
链接:https://www.jianshu.com/p/bd51bcdce67d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。




评论

支持上传图片(拖动图片或者截图粘贴)

0 评论