mongodb插入速度每秒_MongoDB事实:商品硬件上每秒插入80000次以上

mongodb插入速度每秒

在尝试一些时间序列集合时,我需要一个大型数据集来检查我们的聚合查询在增加数据负载的情况下不会成为瓶颈。 我们解决了5000万份文档,因为超出此数目我们仍然会考虑分片。

每次事件如下所示:

{"_id" : ObjectId("5298a5a03b3f4220588fe57c"),"created_on" : ISODate("2012-04-22T01:09:53Z"),"value" : 0.1647851116706831
}

当我们想要获得随机值时,我们考虑使用JavaScript或Python生成它们(我们可以在Java中进行尝试,但是我们希望尽快编写它)。 我们不知道哪个会更快,所以我们决定对其进行测试。

我们的第一次尝试是通过MongoDB Shell运行一个JavaScript文件。

看起来是这样的:

var minDate = new Date(2012, 0, 1, 0, 0, 0, 0);
var maxDate = new Date(2013, 0, 1, 0, 0, 0, 0);
var delta = maxDate.getTime() - minDate.getTime();var job_id = arg2;var documentNumber = arg1;
var batchNumber = 5 * 1000;var job_name = 'Job#' + job_id
var start = new Date();var batchDocuments = new Array();
var index = 0;while(index < documentNumber) {var date = new Date(minDate.getTime() + Math.random() * delta);var value = Math.random();var document = {		created_on : date,value : value};batchDocuments[index % batchNumber] = document;if((index + 1) % batchNumber == 0) {db.randomData.insert(batchDocuments);}index++;if(index % 100000 == 0) {	print(job_name + ' inserted ' + index + ' documents.');}
}
print(job_name + ' inserted ' + documentNumber + ' in ' + (new Date() - start)/1000.0 + 's');

这是我们运行它的方式以及所获得的:

mongo random --eval "var arg1=50000000;arg2=1" create_random.js
Job#1 inserted 100000 documents.
Job#1 inserted 200000 documents.
Job#1 inserted 300000 documents.
...
Job#1 inserted 49900000 documents.
Job#1 inserted 50000000 in 566.294s

好吧,这已经超出了我的期望(每秒88293次插入)。

现在轮到Python了。 您将需要安装pymongo才能正确运行它。

import sys
import os
import pymongo
import time
import randomfrom datetime import datetimemin_date = datetime(2012, 1, 1)
max_date = datetime(2013, 1, 1)
delta = (max_date - min_date).total_seconds()job_id = '1'if len(sys.argv) < 2:sys.exit("You must supply the item_number argument")
elif len(sys.argv) > 2:job_id = sys.argv[2]	documents_number = int(sys.argv[1])
batch_number = 5 * 1000;job_name = 'Job#' + job_id
start = datetime.now();# obtain a mongo connection
connection = pymongo.Connection("mongodb://localhost", safe=True)# obtain a handle to the random database
db = connection.random
collection = db.randomDatabatch_documents = [i for i in range(batch_number)];for index in range(documents_number):try:			date = datetime.fromtimestamp(time.mktime(min_date.timetuple()) + int(round(random.random() * delta)))value = random.random()document = {'created_on' : date,	'value' : value,	}batch_documents[index % batch_number] = documentif (index + 1) % batch_number == 0:collection.insert(batch_documents)		index += 1;if index % 100000 == 0:	print job_name, ' inserted ', index, ' documents.'		except:print 'Unexpected error:', sys.exc_info()[0], ', for index ', indexraise
print job_name, ' inserted ', documents_number, ' in ', (datetime.now() - start).total_seconds(), 's'

我们运行它,这是我们这次得到的:

python create_random.py 50000000
Job#1  inserted  100000  documents.
Job#1  inserted  200000  documents.
Job#1  inserted  300000  documents.
...
Job#1  inserted  49900000  documents.
Job#1  inserted  50000000  in  1713.501 s

与JavaScript版本(每秒插入29180次)相比,它要慢一些,但不要气lets。 Python是一种功能齐全的编程语言,因此如何利用我们所有的CPU内核(例如4个内核)并为每个内核启动一个脚本,每个脚本插入总文档数的一小部分(例如12500000)。

import sys
import pymongo
import time
import subprocess
import multiprocessingfrom datetime import datetimecpu_count = multiprocessing.cpu_count()# obtain a mongo connection
connection = pymongo.Connection('mongodb://localhost', safe=True)# obtain a handle to the random database
db = connection.random
collection = db.randomDatatotal_documents_count = 50 * 1000 * 1000;
inserted_documents_count = 0
sleep_seconds = 1
sleep_count = 0for i in range(cpu_count):documents_number = str(total_documents_count/cpu_count)print documents_numbersubprocess.Popen(['python', '../create_random.py', documents_number, str(i)])start = datetime.now();while (inserted_documents_count < total_documents_count) is True:inserted_documents_count = collection.count()if (sleep_count > 0 and sleep_count % 60 == 0):	print 'Inserted ', inserted_documents_count, ' documents.'		if (inserted_documents_count < total_documents_count):sleep_count += 1time.sleep(sleep_seconds)	print 'Inserting ', total_documents_count, ' took ', (datetime.now() - start).total_seconds(), 's'

运行并行执行Python脚本是这样的:

python create_random_parallel.py
Job#3  inserted  100000  documents.
Job#2  inserted  100000  documents.
Job#0  inserted  100000  documents.
Job#1  inserted  100000  documents.
Job#3  inserted  200000  documents.
...
Job#2  inserted  12500000  in  571.819 s
Job#0  inserted  12400000  documents.
Job#3  inserted  10800000  documents.
Job#1  inserted  12400000  documents.
Job#0  inserted  12500000  documents.
Job#0  inserted  12500000  in  577.061 s
Job#3  inserted  10900000  documents.
Job#1  inserted  12500000  documents.
Job#1  inserted  12500000  in  578.427 s
Job#3  inserted  11000000  documents.
...
Job#3  inserted  12500000  in  623.999 s
Inserting  50000000  took  624.655 s

这确实非常好(每秒插入80044次),即使它仍比第一次JavaScript导入慢。 因此,让我们修改最后一个Python脚本,以通过多个MongoDB Shell运行JavaScript。

由于我无法为mongo命令以及由主python脚本启动的子进程提供必需的参数,因此我提出了以下替代方案:

for i in range(cpu_count):documents_number = str(total_documents_count/cpu_count)script_name = 'create_random_' + str(i + 1) + '.bat'script_file = open(script_name, 'w')script_file.write('mongo random --eval "var arg1=' + documents_number +';arg2=' + str(i + 1) +'" ../create_random.js');script_file.close()subprocess.Popen(script_name)

我们动态生成shell脚本,然后让python为我们运行它们。

Job#1 inserted 100000 documents.
Job#4 inserted 100000 documents.
Job#3 inserted 100000 documents.
Job#2 inserted 100000 documents.
Job#1 inserted 200000 documents.
...
Job#4 inserted 12500000 in 566.438s
Job#3 inserted 12300000 documents.
Job#2 inserted 10800000 documents.
Job#1 inserted 11600000 documents.
Job#3 inserted 12400000 documents.
Job#1 inserted 11700000 documents.
Job#2 inserted 10900000 documents.
Job#1 inserted 11800000 documents.
Job#3 inserted 12500000 documents.
Job#3 inserted 12500000 in 574.782s
Job#2 inserted 11000000 documents.
Job#1 inserted 11900000 documents.
Job#2 inserted 11100000 documents.
Job#1 inserted 12000000 documents.
Job#2 inserted 11200000 documents.
Job#1 inserted 12100000 documents.
Job#2 inserted 11300000 documents.
Job#1 inserted 12200000 documents.
Job#2 inserted 11400000 documents.
Job#1 inserted 12300000 documents.
Job#2 inserted 11500000 documents.
Job#1 inserted 12400000 documents.
Job#2 inserted 11600000 documents.
Job#1 inserted 12500000 documents.
Job#1 inserted 12500000 in 591.073s
Job#2 inserted 11700000 documents.
...
Job#2 inserted 12500000 in 599.005s
Inserting  50000000  took  599.253 s

这也很快(每秒83437次插入),但仍然无法击败我们的第一次尝试。

结论

我的PC配置与众不同,唯一的优化是我有一个运行MongoDB的SSD驱动器。

vlad_pc

第一次尝试产生了最佳结果,并且监视CPU资源后,我意识到MongoDB甚至可以在单个Shell控制台中利用所有这些资源。 在所有内核上运行的Python脚本也足够快,并且它的优点是允许我们根据需要将该脚本转换为可完全运行的应用程序。

  • 代码可在GitHub上获得 。

参考: MongoDB事实:我们的JCG合作伙伴 Vlad Mihalcea在Vlad Mihalcea的Blog博客上每秒插入80000次以上商品硬件 。

翻译自: https://www.javacodegeeks.com/2013/12/mongodb-facts-80000-insertssecond-on-commodity-hardware.html

mongodb插入速度每秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤题库】陕西师范大学201691 日语(二) 作业

一、按要求标注&#xff1a; &#xff08;一&#xff09;给下列汉字注上假名 1、全部   2、世紀   3、政治    4、文化   5、空港  6、生活   7、本棚   8、工夫    9、意見   10、理科 11、案内  12、相談   13、満足   14、社会  15、都会 …

parallels for linux,在 Parallels Desktop 上安装 Remix OS PC

前言个人觉得呢&#xff0c;像 Remix OS 和 Phoenix OS 这样的国产安卓桌面操作系统还是很划时代的。赋予了安卓平台多任务操作的能力&#xff0c;这可以给二合一设备的体验带来一定的变化&#xff0c;但是不像 Surface 一样后面有巨硬给撑腰可以做大做强起来&#xff0c;但是这…

【渝粤题库】陕西师范大学210014幼儿园科学教育作业(高起专)

《幼儿园科学教育》作业 一、填空题 1&#xff0e;科学教育中常采用的观察方法是 ① 、 ② 、 ③ 。 2&#xff0e;幼儿劳动的种类包括 ① 、 ② 、 ③ 、 ④ 。 3&#xff0e;在幼儿科学教育中&#xff0c;情感的目标非常广泛。《纲要》突出了其中两个方面&#xff1a; ① 、 …

模拟用户输入并检查输出的简单方法

最近&#xff0c;我的一些学生向我询问了赫尔辛基大学MOOC提供的单元测试的机制&#xff0c;我检查了它们的实现&#xff0c;并认为这对于初学者了解实际发生的情况是有帮助的&#xff0c;因此在此发表了这篇小文章。 我们将以“机场”项目为例&#xff0c;这是OOP2第一周的最…

android bench内存测试,华为p10内存测试软件(androbench) v5.0.1 免费版

华为p10内存测试软件(androbench)其实是androbench这款内存测试软件&#xff0c;可以用于测试你的华为p10&#xff0c;是一款不错的华为p10内存测试软件&#xff0c;可以测试你的手机闪存性能&#xff0c;其他的手机也可以免费测试哦。华为p10内存测试软件介绍AndroBench是衡量…

【渝粤题库】陕西师范大学400011 思想政治教育学科教学论 作业(专升本)

《思想政治学科教学论》作业 一、多选择题 在下列选项中至少有一项是符合题目要求的 &#xff11;、思想政治学科教学论的学科特点包括&#xff1a; A&#xff0e;社会性 B&#xff0e;综合性 C &#xff0e;实践性 D&#xff0e;系统性   E&#xff0e;完整性 &#xff12;、…

【渝粤题库】陕西师范大学700007 生态学

《生态学》作业 一、名词解释 Meta-种群生态系统次生演替边缘效应初级生产量可持续发展岛屿效应主导因子种群空间分布格局营养级物种多样性生态入侵耐性限度生态位光周期现象趋同适应生态恢复同资源种团原生演替协同进化食物链生态平衡繁殖成效内禀增长率 二、简答题简述丹麦学…

android对话框字体大小,Android Dialog 设置字体大小的具体方法

先看下面图片&#xff1a;这是我在做登录页面的时候&#xff0c;调用系统的progressdialog 进行等待&#xff0c;可是看起来很不协调&#xff0c;左边的等待图片过大&#xff0c;右边文字过小&#xff0c;看起来老别扭&#xff0c;虽然功能上不存在什么问题&#xff0c;但是我有…

国家开放大学2021春1062文学英语赏析题目

教育 教育 试卷代号&#xff1a; 1062 2021年春季学期期末统一考试 文学英语赏析 试题 2021年7月 注意事项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考…

android custom toast,Android自定义Toast

核心代码&#xff1a;package com.huatec.myapplication;import android.content.Context;import android.graphics.Bitmap;import android.support.annotation.ColorInt;import android.support.annotation.DrawableRes;import android.view.Gravity;import android.view.Layo…

【渝粤题库】广东开放大学 大学英语B 形成性考核 (2)

选择题 题目&#xff1a; Do you still get free plastic bags from the supermarkets? Things have changed. China has banned free plastic bags at shops and supermarkets, and people have to pay for using plastic bags. The rule started on June 1. It came becaus…

apache camel_在WildFly中将Apache Camel和Spring添加为jboss模块

apache camel这些天&#xff0c;我在玩Wildfly &#xff0c; Apache Camel和Spring 。 在EAR / WAR之间进行通信的一种简单方法是使用Camel的direct-vm组件。 有或没有骆驼&#xff0c;有很多方法可以实现这一目标。 骆驼在WildFly中就像一个饰物&#xff0c;不需要任何额外的…

国家开放大学2021春1129土木工程力学(本)题目

教育 教育 试卷代号&#xff1a; 1129 2021年春季学期期末统一考试 土木工程力学&#xff08;本&#xff09; 试题 2021年7月 一、单项选择题&#xff08;每小题3分&#xff0c;共30.分。在所列备选项中&#xff0c;选1项正确的或最好的作为答案填入括弧&#xff09; 1.求图示…

华为android打开usb调试模式,华为 PE-CL00 开启USB调试模式

我们要将华为 PE-CL00与电脑进行连接&#xff0c;就必须要打开华为 PE-CL00系统的调试模式&#xff0c;不同的系统版本打开调试模式的方法有所不同&#xff0c;在这里我们就谈谈华为 PE-CL00各种系统版本打开USB调试模式的方法。1、针对Android 2.1-2.2版本的系统&#xff1a;我…

国家开放大学2021春1044合同法题目

教育 教育 试卷代号&#xff1a; 1044 2021年春季学期期末统一考试 合同法 试题 2021年7月 注意事项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监…

API网关和AWS Lambda进行身份验证

当Foreach最初涉足微服务领域时&#xff0c;我们并没有真正构建微服务。 我们以为我们做到了&#xff0c;但是我们所有的服务中总存在一些逻辑。 当然&#xff0c;每个服务实际上应该只专注于自己的任务&#xff0c;而不应该专注于属于另一个微服务的事物。 我们这方面最明显的…

【渝粤教育】广东开放大学 企业项目报表分析 形成性考核 (35)

题库查询系统 选择题 题目&#xff1a;流动债的流动性分析主要从流动负债的到期日流动负债的推迟可能性两方面进行。 答案&#xff1a; A、正确 题目&#xff1a;营业利润是以主营业务利润为基础加上其他业务利润减去销售费用、管理费用和财务费用,再加上营业外收入减去营业外支…

魅蓝x android 7,魅蓝x2什么时候发布 魅蓝x2发布时间最新消息

日前&#xff0c;魅蓝品牌掌门人李楠或kkk便在微博上放出“bluegate(蓝色大门)”这样一个句子&#xff0c;似乎暗示魅蓝品牌或在近期会有动作&#xff0c;并且由于该条微博的尾巴显示为“下款魅蓝Android”&#xff0c;所以在不少网友看来&#xff0c;或许预示着魅蓝将有新机即…

【渝粤教育】广东开放大学 数据库原理与应用 形成性考核 (1)

题库查询系统 选择题 题目&#xff1a;数据库系统是采用了数据库技术的计算机系统&#xff0c;它是一个集合体&#xff0c;包含数据库、计算机硬件、软件和&#xff08; &#xff09; 答案&#xff1a; A、数据库管理员 题目&#xff1a;数据库&#xff08;DB&#xff09;&am…

Android 21mod,熊猫博士小镇合集 Mod

游戏介绍打通30个独具特色的区域界限&#xff0c;探索并发掘各式各样的奇妙冒险&#xff01;开启乐趣无限的冒险&#xff01;想成为一名维护正义的警察&#xff0c;或经营一间自己的美发沙龙&#xff0c;或成为一名救治动物的兽医&#xff1f;在熊猫博士小镇中&#xff0c;一切…