日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
R對MongoDB的性能測試——RMongo

在九月初的時候,RMongoDB正式發(fā)布了修訂版本,這也就意味著,從事數(shù)值計算的語言也可以于Nosql產(chǎn)品相接軌了,但是鑒于我身邊并沒有公司真的在使用R和MongoDB的結(jié)合,所以在效率問題上,我們也不敢掉以輕心,所以就做了一個這樣的測試。

10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有桂陽免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

測試環(huán)境是8核,64位機。 用于測試的庫是一個未經(jīng)Sharding,大概30G左右的Collection。用于存儲用戶的喜好信息,標簽信息等數(shù)據(jù)。

 
 
 
  1. library(rmongodb)   
  2.  
  3. mongo <- mongo.create()  
  4.  
  5. if(mongo.is.connected(mongo))  
  6. {  
  7.     ns <- 'rivendell.user' 
  8.     print('查詢一個沒有索引的字段,查詢一條')  
  9.     print(system.time(p <- mongo.find.one(mongo,ns,list(Friend=600))))  
  10.     print('查詢一個沒有索引的字段,多條,without buffer')  
  11.     print(system.time(p <- mongo.find(mongo,ns,list(Friend=600))))  
  12.     print('看看是否有緩存策略')  
  13.     print(system.time(p <- mongo.find(mongo,ns,list(Friend=600))))  
  14.  
  15.     print('查詢一個沒有索引的字段,多條,has buffer')  
  16.     buf <- mongo.bson.buffer.create()  
  17.     mongo.bson.buffer.append(buf,'Friend',600L)  
  18.     query <- mongo.bson.from.buffer(buf)  
  19.     print(system.time(p <- mongo.find(mongo,ns,query)))  
  20.     print('看看是否有緩存策略')  
  21.     buf <- mongo.bson.buffer.create()  
  22.     mongo.bson.buffer.append(buf,'Friend',600L)  
  23.     query <- mongo.bson.from.buffer(buf)  
  24.     print(system.time(p <- mongo.find(mongo,ns,query)))  
  25.  
  26.     print('大于的查詢,查詢一條記錄')  
  27.     print(system.time(p <- mongo.find.one(mongo,ns,list(Friend=list('$gt'=600L)))))  
  28.     print('大于的記錄,查詢多條記錄')  
  29.     print(system.time(cursor <- mongo.find(mongo,ns,list(Friend=list('$gt'=600L)))))  
  30.     mongo.cursor.destroy(cursor)  
  31.  
  32.     print('查詢一條有索引的記錄')  
  33.     print(system.time(p <- mongo.find.one(mongo,ns,list('_id'=3831809L))))  
  34.     print('查詢索引的記錄')  
  35.     print(system.time(p <- mongo.find(mongo,ns,list('_id'=3831809L))))  
  36.  
  37.     print('插入一條記錄')  
  38.     buf <- mongo.bson.buffer.create()  
  39.     mongo.bson.buffer.append(buf,'name',"huangxin")  
  40.     mongo.bson.buffer.append(buf,'age',22L)  
  41.     p <- mongo.bson.from.buffer(buf)  
  42.     print(system.time(mongo.insert(mongo,ns,p)))  
  43.  
  44.     print('找到剛剛插入的記錄')  
  45.     print(system.time(p <- mongo.find.one(mongo,ns,list('name'='huangxin'))))  
  46.     if(!is.null(p))  
  47.     {  
  48.         print('success')  
  49.     }  
  50.  
  51.     print('批量插入')  
  52.  
  53.     buf <- mongo.bson.buffer.create()  
  54.     mongo.bson.buffer.append(buf,'name','huangxin')  
  55.     mongo.bson.buffer.append(buf,'age',22L)  
  56.     p1 <- mongo.bson.from.buffer(buf)  
  57.  
  58.     buf <- mongo.bson.buffer.create()  
  59.     mongo.bson.buffer.append(buf,'name','huangxin')  
  60.     mongo.bson.buffer.append(buf,'age',22L)  
  61.     p2 <- mongo.bson.from.buffer(buf)  
  62.  
  63.     buf <- mongo.bson.buffer.create()  
  64.     mongo.bson.buffer.append(buf,'name','huangxin')  
  65.     mongo.bson.buffer.append(buf,'age',22L)  
  66.     p3 <- mongo.bson.from.buffer(buf)  
  67.  
  68.     print(system.time(mongo.insert.batch(mongo,ns,list(p1,p2,p3))))  
  69.  
  70.     print('找到剛剛批量插入的記錄')  
  71.     print(system.time(cursor <- mongo.find(mongo,ns,list('name'='huangxin'))))  
  72.  
  73.     i <- 0  
  74.     while(mongo.cursor.next(cursor))  
  75.     {  
  76.         i <- i + 1  
  77.     }  
  78.     print(i)  
  79.  
  80.     print('批量更新')  
  81.     print(system.time(mongo.update(mongo,ns,list(name='huangxin'),list('name'= 'kym'))))  
  82.  
  83.     print('查看更新是否成功')  
  84.     print(system.time(p <- mongo.find.one(mongo,ns,list('name'='kym'))))  
  85.     if(!is.null(p))  
  86.     {  
  87.         print('success')  
  88.     }  
  89.  
  90.     print('批量刪除')  
  91.     print(system.time(mongo.remove(mongo,ns,list(name='kym'))))  
  92. }  
  93.  
  94.     print(system.time(p <- mongo.find.one(mongo,ns,list('name'='kym'))))  
  95.     if(!is.null(p))  
  96.     {  
  97.         print('success')  
  98.     }  
 
 
 
  1. [1] "查詢一個沒有索引的字段,查詢一條" 
  2. user system elapsed  
  3. 0.000 0.000 0.115  
  4. [1] "查詢一個沒有索引的字段,多條,without buffer" 
  5. user system elapsed  
  6. 0.000 0.000 32.513  
  7. [1] "看看是否有緩存策略" 
  8. user system elapsed  
  9. 0.000 0.000 32.528  
  10. [1] "查詢一個沒有索引的字段,多條,has buffer" 
  11. user system elapsed  
  12. 0.000 0.000 32.685  
  13. [1] "看看是否有緩存策略" 
  14. user system elapsed  
  15. 0.000 0.000 33.172  
  16. [1] "大于的查詢,查詢一條記錄" 
  17. user system elapsed  
  18. 0.000 0.000 0.001  
  19. [1] "大于的記錄,查詢多條記錄" 
  20. user system elapsed  
  21. 0.000 0.000 0.014  
  22. [1] "查詢一條有索引的記錄" 
  23. user system elapsed  
  24. 0 0 0  
  25. [1] "查詢索引的記錄" 
  26. user system elapsed  
  27. 0 0 0  
  28. [1] "插入一條記錄" 
  29. user system elapsed  
  30. 0 0 0  
  31. [1] "找到剛剛插入的記錄" 
  32. user system elapsed  
  33. 0.00 0.00 35.42  
  34. [1] "success" 
  35. [1] "批量插入" 
  36. user system elapsed  
  37. 0 0 0  
  38. [1] "找到剛剛批量插入的記錄" 
  39. user system elapsed  
  40. 0.004 0.000 35.934  
  41. [1] 7  
  42. [1] "批量更新" 
  43. user system elapsed  
  44. 0.000 0.004 0.000  
  45. [1] "查看更新是否成功" 
  46. user system elapsed  
  47. 0.000 0.000 67.773  
  48. [1] "success" 
  49. [1] "批量刪除" 
  50. user system elapsed  
  51. 0 0 0  
  52. user system elapsed  
  53. 0.000 0.000 91.396 

之前我一直不太理解的就是為什么大于和等于,差距會差這么多。后來當我在用Python去做同樣的測試的時候發(fā)現(xiàn),Python兩者的效率其實是相同的,所以這就證明了這個不是MongoDB的問題,而我不相信在數(shù)據(jù)庫層面,一個語言的Driver會有這么大的差別。

后來我發(fā)現(xiàn)了Python和R的關(guān)于MongoDB Driver的一個區(qū)別。首先,Python find的時候,不是將查詢到的數(shù)據(jù)集整體拉回,而是返回一個cursor,也就是說,他在執(zhí)行find命令的時候并不消耗時間,而如果加上while cursor.next()的時候,才會真正地去執(zhí)行這個查詢。

但是R不一樣,R會首先考慮數(shù)據(jù)集的大?。ɑ蛘咂渌闆r),然后視情況而定地返回cursor還是將整個數(shù)據(jù)集整體拉回。如果我們將之前的while mongo.cursor.next(cursor)也算在計算時間的時候,那么我們就會發(fā)現(xiàn),其實大于和等于的操作,效率相差并不明顯了.......

在實際操作中,批量插入是一個非常常見的應(yīng)用場景,但是對于R或者Matlab語言來說,循環(huán)的效率一直是硬傷,所以接下來,我會嘗試著用apply系列來解決R語言的循環(huán)問題,如果實際操作發(fā)現(xiàn)可行,那么接下來使用mutilab等R的并行計算庫來充分發(fā)揮多核的效率也值得嘗試了!

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


新聞名稱:R對MongoDB的性能測試——RMongo
分享URL:http://www.dlmjj.cn/article/dpcgdpg.html