在百万级和千万级数据级别进行插入,pymongo的insert_many()方法有着很强的优势。原因是每次使用insert_one()方法进行插入数据,都是要对数据库服务器进行一次访问,而这样的访问是基于TCP连接的,每次在发送请求的时候服务器端都需要对TCP报文进行解析。而使用insert_many(),可以一次给服务器发送大量的数据,只需要一次的TCP报文解析,既可以插入大量数据,避免了大量的报文解析工作。这样一来,数据插入的效率就会大大提升。所以,为了提升效率,笔者建议在十万数据级别以上使用insert_many()方法。

下面是我通过使用pymongo原生方法和框架中的经常使用的Mongoengine进行的性能测试。

一、使用Mongoengine

Mongoengine是基于面向对象的,在构建集合的时候非常方便,就直接写一个类。而pymongo是继承于MongoDB的文档类型的,所以在框架中使用会相对没有那么方便。但是Mongoengine目前来讲还有许多还没有完善的地方。个人觉得,还是根据实际的需求来选择不同的引擎。

插入数据方面,Mongoengine在0.15版本之前只有save()方法,在0.15版本之后添加了insert_one()和inset_many()方法,具体可以看官方文档:。

但是由于Django官方没有将MongoDB列为建议使用的数据库,所以不支持0.9之后的版本。

代码:

插入一千条数据

插入方法:使用save()保存数据

耗时:大概2秒钟

插入10万条数据

插入方法:使用save()

耗时:两分多钟

二、使用pymongo

(1)测试1:插入一百万数据

插入方法:insert_many()

耗时:28秒

代码:

耗时时间:

插入结果:

(2)测试2:在一百万条数据基础上增加十万数据

插入方法:insert_one()

耗时:1分钟29秒

代码:

耗时时间:

插入结果:

通过上面的测试,很明显的看到,无论是使用Mongoengine的save()方法,还是使用pymongo的insert_one()方法,在大数据量的插入时都会耗费大量的时间,在百万级别的数据就已经需要花费5-6个小时的时间了,显然,这样的效率是很低的。更别说千万级别的数据了。

而使用pymongo的insert_many()方法,在插入百万条数据只是花费了28秒,速度好像快得有点难以想象是吧?按照这样的推算,千万级别数据的数据也大概花费不到5分钟就可以完成了。

那么为什么pymongo的原生方法insert_many()有这么高的效率呢?如何能更进一步提高效率呢?通过阅读源码和分析参数,来了解一下。

insert_many() 定义源码:

def insert_many(self, documents, ordered=True,
bypass_document_validation=False, session=None):

官方对参数的解析:

参数:

documents就是我们需要插入的数据文档,也就是上文的articles

下面重点讲ordered和bypass_document_validaion

1. ordered

默认情况下是True,即按顺序来插入多条数据,如果发生错误,就会终止后面的插入。如果设置为False,文档将以任意的顺序将数据插入到服务器中,并且是并行进行的,客户端会尽力将所有的数据都插入到服务器中。所以,设置为False会在数据的插入效率有很大的提升,但也要付出一点数据安全性的代价。

2. bypass_document_validation

默认情况为False。如果为True,那么允许在写入发生错误的时候推出文档级别的验证,不影响后面的数据插入。

设置合适的参数值,可以更好地为海量数据的插入提供更好的插入环境。

笔者:

欢迎评论!希望本人的文章对阅读者有帮助,在写作过程中难免有疏漏,希望读者在发现错误的地方及时向我提出,我会尽快修改自己的技术疏漏。我也会定时写一些自己学习中的收获和项目中的经验。希望前行的路上,有更多乐于分享的人一起作伴。

Django+MongoDB批量插入数据的更多相关文章

  1. mongodb批量插入数据

    年前由于公司业务需要,后台需要获取流水记录,需要每天定时跑脚本,将流水记录跑入库里边,每天大概有个一百万左右,使用的数据库是mongodb,考虑到一条一条录入数据,100多万会跑断,就想着批量录入数据 ...

  2. django ajax 及批量插入数据 分页器

    ``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码 ...

  3. Django orm 实现批量插入数据

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...

  4. django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件

    目录 一.ajax结合sweetalter 二.bulk_create批量插入数据 三.简易版分页器推导 1. 推导步骤 四.自定义分页器的使用 1. 自定义分页器模板 2. 使用方法 (1)后端代码 ...

  5. [Django高级之批量插入数据、分页器组件]

    [Django高级之批量插入数据.分页器组件] 批量插入数据 模板层models.py from django.db import models class Books(models.Model): ...

  6. Django批量插入数据和分页器

    目录 一.ajax结合sweetalert实现删除按钮动态效果 二.bulk_create批量插入数据 1. 一条一条插入 2. 批量插入 三.自定义分页器 一.ajax结合sweetalert实现删 ...

  7. django----Sweetalert bulk_create批量插入数据 自定义分页器

    目录 一.Sweetalert使用AJAX操作 二.bulk_create 三.分页器 divmod 分页器组件 自定义分页器的使用 一.Sweetalert使用AJAX操作 ​ sweetalert ...

  8. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  9. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

随机推荐

  1. [EXP]windows全版本SMB溢出工具加强版

    工具:k8加强版zzz 编译:python 漏洞:MS17-010 用法: zzz_exploit.exe 192.11.22.82zzz_exploit.exe 192.11.22.82 exe参数 ...

  2. mysql 开发基础系列7 流程函数与其它函数

    一.流程函数 -- 创建表来介绍 ,)); ,),(,), (,),(,),(,), (,NULL); SELECT * FROM salary 1. if(value,t,f)  超过2000的用h ...

  3. 关于EF的三种分类----CodeFirst

    新建StudentInfo.cs using System; using System.Collections.Generic; using System.ComponentModel.DataAnn ...

  4. crontab的使用笔记

    1 crond简介crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cron ...

  5. SQL语句方法语法总结(一)

    1.distinct:返回不重复.唯一的值. select distinct col_name from tbl_name --表中的col_name 列的值 如果有10条一样的,仅返回一条. 2.w ...

  6. Zookeeper Client简介

    直接使用zk的api实现业务功能比较繁琐.因为要处理session loss,session expire等异常,在发生这些异常后进行重连.又因为ZK的watcher是一次性的,如果要基于wather ...

  7. 自动生成实体类和xml

    1 首先eclipse需要安装一个插件 2 两个配置文件 1 generator.properties 2 generator.xml <?xml version="1.0" ...

  8. MySQL的binlog恢复(Windows下)

    前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...

  9. SpringBoot系列——EnableScheduling,对定时器的支持

    前言 定时器功能在项目里面往往会用到,比如定时发送邮件.定时释放数据库资源:这里记录一下springboot对定时器的支持的简单实例 cron表达式 开始之前要先介绍一下cron表达式,这里当一下百度 ...

  10. Hive环境搭建及测试

     前提条件:已经安装好如下软件 Eclipse4.5 hadoop-2.7.3 jdk1.7.0_79 此篇文章基于上一篇文章:zookeeper高可用集群搭建 什么是Hive? 1.Hive是一个基 ...