Mongo性能测试-python脚本
单线程
500+w条数据,插入时间:1小时,13分钟。
脚本:
[root@10 hurl]# cat insert-mongo2.py
#!/usr/bin/env python
#coding=utf-8
import time,datetime
import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://test:test123@172.16.100.26:27019/test')
db = client.test
#from pymongo import Connection
#connection = Connection('127.0.0.1', 27017)
#db = connection['test']
#时间记录器
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def insert(num):
posts = db.userinfo
for x in range(num):
post = {"_id" : str(x),
"author": str(x)+"Mike",
"description1":"this is a very long description for " + str(x),
"description2":"this is a very long description for " + str(x),
"description3":"this is a very long description for " + str(x),
"description4":"this is a very long description for " + str(x),
"description5":"this is a very long description for " + str(x),
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts.insert_one(post)
if x%100000 == 0:
print "100000 ! -- %s"%(datetime.datetime.now())
if __name__ == "__main__":
#设定循环1000万次
num = 10000000
insert(num)
插入总数:
mongos> db.userinfo.count()
5033914
mongos>
多进程并发:
测试脚本:
[root@10 hurl]# cat insert-mongo3.py
#!/usr/bin/env python
#coding=utf-8
import multiprocessing,random,string
import time,datetime
import pymongo
from pymongo import MongoClient
def gen_load(x,taskid):
client = MongoClient('mongodb://test:test123@172.16.100.26:27019/test')
db = client.test
posts = db.userinfo2
for x in range(1000000):
post = {"_id" : str(x),
"author": str(x)+"Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts.insert_one(post)
if x%100000 == 0:
print "100000 ! -- %s"%(datetime.datetime.now())
if __name__ == '__main__':
inser_number=2500
pro_pool = multiprocessing.Pool(processes=100)
print time.strftime('%Y-%m-%d:%H-%M-%S',time.localtime(time.time()))
start_time=time.time()
manager = multiprocessing.Manager()
for i in xrange(10):
taskid=i
pro_pool.apply_async(gen_load,args=(inser_number,taskid))
pro_pool.close()
pro_pool.join()
elapsed = time.time()-start_time
print elapsed
time.sleep(1)
print "Sub-process(es) done."
10w条数据插入
100个线程,10w条数据,86秒
[root@10 hurl]# python insert-mongo3.py
2015-12-08:13-54-53
10000 ! -- 2015-12-08 13:54:53.822510
10000 ! -- 2015-12-08 13:55:02.329206
10000 ! -- 2015-12-08 13:55:10.624850
10000 ! -- 2015-12-08 13:55:19.763308
10000 ! -- 2015-12-08 13:55:28.384718
10000 ! -- 2015-12-08 13:55:36.957917
10000 ! -- 2015-12-08 13:55:45.426113
10000 ! -- 2015-12-08 13:55:53.872843
10000 ! -- 2015-12-08 13:56:02.898263
10000 ! -- 2015-12-08 13:56:11.243706
86.4502689838
Sub-process(es) done.
100个进程:
[root@10 hurl]# ps -ef| grep python | wc -l
103
100w条数据:
100个线程,100w条数据,858秒:
[root@10 hurl]# python insert-mongo3.py
2015-12-08:14-04-21
100000 ! -- 2015-12-08 14:04:21.481368
100000 ! -- 2015-12-08 14:05:43.069700
100000 ! -- 2015-12-08 14:07:05.694774
100000 ! -- 2015-12-08 14:08:28.375586
100000 ! -- 2015-12-08 14:09:51.335589
100000 ! -- 2015-12-08 14:11:18.619572
100000 ! -- 2015-12-08 14:12:45.748144
100000 ! -- 2015-12-08 14:14:12.534341
100000 ! -- 2015-12-08 14:15:43.059457
100000 ! -- 2015-12-08 14:17:11.387942
858.129628897
Sub-process(es) done.
[root@10 hurl]#
查询:
在500w条数据中随机查询100w次,用时15秒。
[root@10 hurl]# python find-mongo2.py
find 0 .
find 100000 .
find 200000 .
find 300000 .
find 400000 .
find 500000 .
find 600000 .
find 700000 .
find 800000 .
find 900000 .
mread run: 15.3293960094
[root@10 hurl]#
脚本:
[root@10 hurl]# cat find-mongo2.py
#!/usr/bin/env python
#coding=utf-8
import time,datetime
import random
import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://test:test123@172.16.100.26:27019/test')
db = client.test
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
#@func_time
def randy():
rand = random.randint(1,5000000)
return rand
@func_time
def mread(num):
find = db.userinfo
for i in range(num):
rand = randy()
#随机数查询
find.find({"author": str(rand)+"Mike"})
if i%100000 == 0:
print "find %s ."%i
if __name__ == "__main__":
#设定循环100万次
num = 1000000
mread(num)
无索引Update
在500w数据中,无索引update100条数据,567秒:
[root@10 hurl]# python update-mongo2.py
mread run: 567.210422993
[root@10 hurl]#
脚本:
[root@10 hurl]# cat update-mongo2.py
#!/usr/bin/env python
#coding=utf-8
import time,datetime
import random
import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://test:test123@172.16.100.26:27019/test')
db = client.test
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
#@func_time
def randy():
rand = random.randint(1,5000000)
return rand
@func_time
def mread(num):
update = db.userinfo
for i in range(num):
rand = randy()
name = str(rand)+"Mike"
#随机数查询
print "uodate %s "%name
update.update_one({"author": name},{"$set":{"text":"My second blog post!"}})
if __name__ == "__main__":
#设定循环
num = 100
mread(num)
Create index
500w条数据,创建索引,用时70秒。
[root@10 hurl]# python index-mongo2.py
insert run: 70.6546721458
脚本:
[root@10 hurl]# vi index-mongo2.py
#!/usr/bin/env python
#coding=utf-8
import time,datetime
import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://test:test123@172.16.100.26:27019/test')
db = client.test
#时间记录器
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def createInx(num):
posts = db.userinfo
posts.create_index('author', unique=True)
if __name__ == "__main__":
#设定循环
num = 1
createInx(num)
有索引Update
在500w数据中,有索引update100条数据,1.98秒:
[root@10 hurl]# python update-mongo2.py
mread run: 1.98181605339
[root@10 hurl]#
Delete
500w条数据,删除完成,使用时间:541.97秒。
[root@10 hurl]# python delete-mongo2.py
count before remove: 5033914
count after remove: 0
insert run: 541.965857983
脚本:
[root@linux-00 sh]# python delete-mongo2.py
count before remove: 100000
count after remove: 0
remove run: 0.951205015182
[root@linux-00 sh]# cat delete-mongo2.py
#!/usr/bin/env python
import time,datetime
import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client.test
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def remove():
posts = db.userinfo
print 'count before remove:',posts.count();
posts.delete_many({});
print 'count after remove:',posts.count();
if __name__ == "__main__":
remove()
总结:
|
单进程 |
多进程 |
多进程 |
单进程 |
|
|
数据量 |
500w |
10w |
100w |
500w |
|
操作 |
insert |
insert |
insert |
Find 100w次 |
|
用时 |
1小时13分钟 |
86秒 |
858秒 |
15秒 |
|
平均(条/秒) |
1141.55 |
1162.79 |
1165.50 |
66666.67 |
注:我自己电脑上的虚拟机插入测试,单线程,10w条数据,用时30秒,平均3333条每秒
|
数据量 |
500w |
500w |
500w |
500w |
|
索引 |
无索引 |
有索引 |
||
|
操作 |
Update100条数据 |
Update100条数据 |
创建索引 |
delete |
|
用时 |
567秒 |
1.98秒 |
70.65 |
541.97秒 |
|
平均(条/秒) |
0.1764 |
50.51 |
70771.41 |
9225.60 |
Mongo性能测试-python脚本的更多相关文章
- python脚本批量生成数据
在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...
- 如何在python脚本开发做code review
在软件项目开发中,我们经常提到一个词“code review”.code review中文翻译过来就是代码评审或复查,简而言之就是编码完成后由其他人通过阅读代码来检查代码的质量(可编译.可运行.可读. ...
- freeswitch嵌入python脚本
操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 python版本:2.7.9 开启python模块 安装python lib库 apt-get install pyt ...
- python脚本后台运行
问题描述: 环境: CentOS6.4 一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本: python t ...
- 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本
某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...
- 动态执行python脚本
前言 存在许多独立的python脚本,这些脚本可能会增加,也可能会减少,现在需要按照某种顺序调度这些程序.在python的standard library中,有一个模块imp可以实现动态的调用ptho ...
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...
- SecureCRT中python脚本编写
SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是Secu ...
- Python脚本配合Linux计划任务工作
经常遇到直接运行Python脚本没有问题,但是一放入/etc/crontab之后就歇菜的情况,总结了一下,大致需要注意以下几点: 1. 脚本首行加入#!/usr/bin/env python 2. 脚 ...
随机推荐
- MyEclipse 快捷键方法
MyEclipse企业级工作平台(My Eclipse Enterprise Workbench,简称MyEclipse)是对EclipseIDE的扩展,利用它可以在数据库和J2EE的开发.发布,以及 ...
- HDU_1203_01背包
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- CAD把控件图形变成二进制流输出(com接口VB语言)
主要用到函数说明: _DMxDrawX::WriteBinStream 把控件图形变成二进制流输出,详细说明如下: 参数 说明 VARIANT* pVarBinArray 输出二进制数组.是个byte ...
- Day 14B 网络应用开发
网络应用开发 发送电子邮件 在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知.网站向用户发送一个激活账号的链接.银行向客户推广它们的理财产品等几乎都 ...
- Ztree加载完成后显示勾选节点
①前言:这个在度娘上没有搜到解决的办法,于是自己查看了ztree的API,发现其实还是比较简单的.做个笔记以备不时之需. ②需求: 像下图一样,在加载完成之后就显示需要勾选的项. ③解决方案: 首先页 ...
- Django ContentType内置组件
一.引出问题 假如有这两张表,它们中的课程可能价格不一样.周期不一样.等等...不一样...,现在有一张价格策略表,怎么就用一张表报保存它们之间不同的数据呢? 可能你会这样: 确实是行!但是,如果有很 ...
- page对象的使用及常见方法
page对象的使用及常见方法 制作人:全心全意 page对象代表JSP本身,只有在JSP页面内才是合法的.page对象本质上是包含当前Servlet接口引用的变量,可以看作是this关键字的别名. p ...
- Tornado进阶
三.Tornado进阶 3.1 Application settings debug,设置tornado是否工作在调试模式,默认为False即工作在生产模式.当设置debug=True 后,torna ...
- 设置NODE_ENV=test环境变量
之前开发时因为有内网测试环境和外网测试环境,再部署打包时总是切换两个域名,比较麻烦,所以最好能设置一个环境变量,来控制两个域名,于是做了如下配置: "scripts": { &qu ...
- __setitem__() __getitem__() __delitem__()
#item系列 和对象使用[]访问值有联系 #obj={'k':'v'} #print(obj) #print(obj['k']) class B: def __getitem__(self, ite ...