R对MongoDB的性能测试——RMongo

在九月初的时候,R">MongoDB正式发布了修订版本,这也就意味着,从事数值计算的语言也可以于Nosql产品相接轨了,但是鉴于我身边并没有公司真的在使用R和MongoDB的结合,所以在效率问题上,我们也不敢掉以轻心,所以就做了一个这样的测试。

测试环境是8核,64位机。 用于测试的库是一个未经Sharding,大概30G左右的Collection。用于存储用户的喜好信息,标签信息等数据。

library(rmongodb)    mongo <- mongo.create()   if(mongo.is.connected(mongo))  {      ns <- 'rivendell.user'     print('查询一个没有索引的字段,查询一条')      print(system.time(p <- mongo.find.one(mongo,ns,list(Friend=600))))      print('查询一个没有索引的字段,多条,without buffer')      print(system.time(p <- mongo.find(mongo,ns,list(Friend=600))))      print('看看是否有缓存策略')      print(system.time(p <- mongo.find(mongo,ns,list(Friend=600))))       print('查询一个没有索引的字段,多条,has buffer')      buf <- mongo.bson.buffer.create()      mongo.bson.buffer.append(buf,'Friend',600L)      query <- mongo.bson.from.buffer(buf)      print(system.time(p <- mongo.find(mongo,ns,query)))      print('看看是否有缓存策略')      buf <- mongo.bson.buffer.create()      mongo.bson.buffer.append(buf,'Friend',600L)      query <- mongo.bson.from.buffer(buf)      print(system.time(p <- mongo.find(mongo,ns,query)))       print('大于的查询,查询一条记录')      print(system.time(p <- mongo.find.one(mongo,ns,list(Friend=list('$gt'=600L)))))      print('大于的记录,查询多条记录')      print(system.time(cursor <- mongo.find(mongo,ns,list(Friend=list('$gt'=600L)))))      mongo.cursor.destroy(cursor)       print('查询一条有索引的记录')      print(system.time(p <- mongo.find.one(mongo,ns,list('_id'=3831809L))))      print('查询索引的记录')      print(system.time(p <- mongo.find(mongo,ns,list('_id'=3831809L))))       print('插入一条记录')      buf <- mongo.bson.buffer.create()      mongo.bson.buffer.append(buf,'name',"huangxin")      mongo.bson.buffer.append(buf,'age',22L)      p <- mongo.bson.from.buffer(buf)      print(system.time(mongo.insert(mongo,ns,p)))       print('找到
刚刚插入的记录')      print(system.time(p <- mongo.find.one(mongo,ns,list('name'='huangxin'))))      if(!is.null(p))      {          print('success')      }       print('批量插入')       buf <- mongo.bson.buffer.create()      mongo.bson.buffer.append(buf,'name','huangxin')      mongo.bson.buffer.append(buf,'age',22L)      p1 <- mongo.bson.from.buffer(buf)       buf <- mongo.bson.buffer.create()      mongo.bson.buffer.append(buf,'name','huangxin')      mongo.bson.buffer.append(buf,'age',22L)      p2 <- mongo.bson.from.buffer(buf)       buf <- mongo.bson.buffer.create()      mongo.bson.buffer.append(buf,'name','huangxin')      mongo.bson.buffer.append(buf,'age',22L)      p3 <- mongo.bson.from.buffer(buf)       print(system.time(mongo.insert.batch(mongo,ns,list(p1,p2,p3))))       print('找到刚刚批量插入的记录')      print(system.time(cursor <- mongo.find(mongo,ns,list('name'='huangxin'))))       i <- 0      while(mongo.cursor.next(cursor))      {          i <- i + 1      }      print(i)       print('批量更新')      print(system.time(mongo.update(mongo,ns,list(name='huangxin'),list('name'= 'kym'))))       print('查看更新是否成功')      print(system.time(p <- mongo.find.one(mongo,ns,list('name'='kym'))))      if(!is.null(p))      {          print('success')      }       print('批量删除')      print(system.time(mongo.remove(mongo,ns,list(name='kym'))))  }       print(system.time(p <- mongo.find.one(mongo,ns,list('name'='kym'))))      if(!is.null(p))      {          print('success')      } 
[1] "查询一个没有索引的字段,查询一条" user system elapsed  0.000 0.000 0.115  [1] "查询一个没有索引的字段,多条,without buffer" user system elapsed  0.000 0.000 32.513  [1] "看看是否有缓存策略" user system elapsed  0.000 0.000 32.528  [1] "查询一个没有索引的字段,多条,has buffer" user system elapsed  0.000 0.000 32.685  [1] "看看是否有缓存策略" user system elapsed  0.000 0.000 33.172  [1] "大于的查询,查询一条记录" user system elapsed  0.000 0.000 0.001  [1] "大于的记录,查询多条记录" user system elapsed  0.000 0.000 0.014  [1] "查询一条有索引的记录" user system elapsed  0 0 0  [1] "查询索引的记录" user system elapsed  0 0 0  [1] "插入一条记录" user system elapsed  0 0 0  [1] "找到刚刚插入的记录" user system elapsed  0.00 0.00 35.42  [1] "success" [1] "批量插入" user system elapsed  0 0 0  [1] "找到刚刚批量插入的记录" user system elapsed  0.004 0.000 35.934  [1] 7  [1] "批量更新" user system elapsed  0.000 0.004 0.000  [1] "查看更新是否成功" user system elapsed  0.000 0.000 67.773  [1] "success" [1] "批量删除" user system elapsed  0 0 0  user system elapsed  0.000 0.000 91.396 

之前我一直不太理解的就是为什么大于和等于,差距会差这么多。后来当我在用Python去做同样的测试的时候发现,Python两者的效率其实是相同的,所以这就证明了这个不是MongoDB的问题,而我不相信在数据库层面,一个语言的Driver会有这么大的差别。

后来我发现了Python和R的关于MongoDB Driver的一个区别。首先,Python find的时候,不是将查询到的数据集整体拉回,而是返回一个cursor,也就是说,他在执行find命令的时候并不消耗时间,而如果加上while cursor.next()的时候,才会真正地去执行这个查询。

但是R不一样,R会首先考虑数据集的大小(或者其他情况),然后视情况而定地返回cursor还是将整个数据集整体拉回。如果我们将之前的while mongo.cursor.next(cursor)也算在计算时间的时候,那么我们就会发现,其实大于和等于的操作,效率相差并不明显了.......

在实际操作中,批量插入是一个非常常见的应用场景,但是对于R或者Matlab语言来说,循环的效率一直是硬伤,所以接下来,我会尝试着用apply系列来解决R语言的循环问题,如果实际操作发现可行,那么接下来使用mutilab等R的并行计算库来充分发挥多核的效率也值得尝试了!

原文链接:http://www.cnblogs.com/kym/archive/2011/09/26/2191501.html

时间: 2024-10-05 00:19:52

R对MongoDB的性能测试——RMongo的相关文章

MongoDB 生态 - 官方命令行工具

工欲善其事,必先利其器,我们在使用数据库时,通常需要各种工具的支持来提高效率:很多新用户在刚接触 MongoDB 时,遇到的问题是『不知道有哪些现成的工具可以使用』,本系列文章将主要介绍 MongoDB 生态在工具.driver.可视化管理等方面的支持情况. 本文主要介绍 MongoDB 官方的命令行工具 Mongo shell MongoDB 的命令行管理工具,也是 MongoDB 最常用的工具,功能非常丰富,比如常用的 show dbs / show tables / show users

性能测试:SequoiaDB vs. MongoDB vs. Cassandra vs. HBase

[编者按]在<先锋>系列的 事务.高性能,王涛谈打造超越MongoDB的NoSQL一文中,我们与王涛浅谈了高性能,拥有事务的SequoiaDB打造经验.应读者需求,从数据上解读各个NoSQL的优势,我们同时邀请了国内外相关专家对MongoDB.SequoiaDB.Cassandra.HBase四个NoSQL进行基准测试,并公布测试用例.相关数据及测试规则.本次我们将给大家放出国内专家的测评,仅供参考.PS:为了方便传阅,特别为大家准备了PDF版本,点击下载 . 下为测试资料 在本篇测试报告中,

Mongodb亿级数据量的性能测试

Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 (使用的是官方C#客户端的InsertBatch),这个测的是批量插入性能能有多少提高 3) 安全插入功能 (确保插入成功,使用的是SafeMode.True开关),这个测的是安全插入性能会差多少 4) 查询一个索引后的数字列,返回10条记录(也就是10KB)的性能,这个测的是索引查询的性能 5) 查询两个索引

1亿条记录的MongoDB数据库随机查询性能测试_MongoDB

mongdb性能压力测试,随机查询,数据量1亿条记录 操作系统centos6.4x64位 从测试结果看,当mongodb将数据全部载入到内存后,查询速度根据文档的大小,性能瓶颈通常会是在网络流量和CPU的处理性能(该次测试中当数据全部在内存后,纯粹的查询速度可以稳定在10W/S左右,系统load可以维持在1以下,由于此时CPU已经被使用到极限了,当并发再大时load值会直线飙升,性能急剧下降). 压力生成服务器与Mongodb服务器基本配置 cpu型号:Intel(R) Xeon(R) CPU

Mongodb亿级数据量的性能测试比较完整收藏一下

原文地址:http://www.cnblogs.com/lovecindywang/archive/2011/03/02/1969324.html 进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 (使用的是官方C#客户端的InsertBatch),这个测的是批量插入性能能有多少提高 3) 安全插入功能 (确保插入成功,使用的是SafeMode.Tr

性能测试:自建数据库对比RDS中应当注意的地方(适用于MySQL,SQL SERVER,MongoDB)

性能测试:自建数据库对比RDS中应当注意的地方 背景 常常很多用户对比测试自建数据库和RDS的性能差异,其测试结果往往是RDS不如ECS自建,用户往往怀疑难道我花了那么多的钱买的RDS难道还不如自己在ECS上搭建?   从数据库测试的角度来看,测试首先必须是的公平的进行,其结果才具有说服力.RDS作为一个公共的关系数据库服务,其必须要包括稳定高可用,高安全,然后才是高性能.没有前面的两者,我相信没有多少人愿意去使用即不稳定又不安全的服务.所以RDS在稳定性上必须上主备双节点的,双节点甚至是在不同

《R语言数据分析》——1.4 从数据库中导入数据

1.4 从数据库中导入数据 使用一个专用的数据库测试平台比根据需要从磁盘中导入文件效率要高很多,这是由数据库本身特性决定的: 对大数据表的访问速度更快 在数据导入R前,提供了更快更有效的数据聚集和筛选方法 相比电子表格以及R对象实现的传统矩阵模型,能够提供更加结构化的关系 数据模型来存储数据 提供对数据的连接及合并操作 在同一时间支持对多个客户端的并发远程访问 提供了安全和有限的访问 提供可扩展及可配置的数据存储后台 DBI包提供了数据库操作的接口,可以作为R和不同关系数据管理系统(Relati

《R的极客理想—工具篇》—— 1.6 R和JSON的傻瓜式编程

1.6 R和JSON的傻瓜式编程 问题 如何让R语言的数据类型转换成JSON数据类型? 引言 JSON作为一种轻量级数据格式,被大量地应用在各种程序环境中.JSON(JavaScript Object Notation)是JavaScript的内嵌的标准对象,同时也是MongoDB的表结构存储类型.JSON是半结构化的,可以表达出丰富的文档含义.JSON文档比XML文档要少很多,更适合于网络传输.早期R语言编程很少会用到JSON,但随着R语言的壮大,R也在伸向各种领域,JSON就是与其他领域的一

Docker&amp;MongoDB实战(二)性能与容错

本文讲的是Docker&MongoDB实战(二)性能与容错,[编者的话]在Docker中运行数据库很多人都想过,但是IO方面和在实体机上运行会有差异吗?数据应该怎么存储?映射到主机还是使用一个单独存储数据的容器?哪种方式更好?性能方面呢?本文针对这些问题一一给出了答案.第一篇文章在这里. 在前面,我们已经知道怎样创建和运行一个简单的基于CentOS的MongoDB实例.这对于开发或者测试使用来说再好不过了,但是它并没有说明一些性能和容错能力的问题.在本文中,我们会了解Docker相关的磁盘存储选