当前位置:天才代写 > tutorial > 其他教程 > R对MongoDB机能的测试

R对MongoDB机能的测试

2017-12-04 08:00 星期一 所属: 其他教程 浏览:675

在九月初的时候,RMongoDB正式宣布了修订版本,这也就意味着,从事数值计较的语言也可以于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
.000 0.000 0.115


[1] “查询一个没有索引的字段,多条,without buffer”


user system elapsed
.000 0.000 32.513


[1] “看看是否有缓存计策”


user system elapsed
.000 0.000 32.528


[1] “查询一个没有索引的字段,多条,has buffer”


user system elapsed
.000 0.000 32.685


[1] “看看是否有缓存计策”


user system elapsed
.000 0.000 33.172


[1] “大于的查询,查询一笔记录”


user system elapsed
.000 0.000 0.001


[1] “大于的记录,查询多笔记录”


user system elapsed
.000 0.000 0.014


[1] “查询一条有索引的记录”


user system elapsed
 0 0


[1] “查询索引的记录”


user system elapsed
 0 0


[1] “插入一笔记录”


user system elapsed
 0 0


[1] “找到方才插入的记录”


user system elapsed
.00 0.00 35.42


[1] “success”


[1] “批量插入”


user system elapsed
 0 0


[1] “找到方才批量插入的记录”


user system elapsed
.004 0.000 35.934


[1] 7


[1] “批量更新”


user system elapsed
.000 0.004 0.000


[1] “查察更新是否乐成”


user system elapsed
.000 0.000 67.773


[1] “success”


[1] “批量删除”


user system elapsed
 0 0


user system elapsed
.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的并行计较库来充实发挥多核的效率也值得实验了!

 

    关键字:

天才代写-代写联系方式