在九月初的時候,rmongodb正式發布了修訂版本,這也就意味著,從事數值計算的語言也可以於nosql產品相接軌了,但是鑑於我身邊並沒有公司真的在使用r和mongodb的結合,所以在效率問題上,我們也不敢掉以輕心,所以就做了乙個這樣的測試。
測試環境是8核,64位機。 用於測試的庫是乙個未經sharding,大概30g左右的collection。用於儲存使用者的喜好資訊,標籤資訊等資料。
1 library(rmongodb)
23 mongo <- mongo.create()
45if(mongo.
is.connected(mongo))
6
5051
print(
'批量插入
')
5253 buf <- mongo.bson.buffer.create()
'name
', '
huangxin
') '
age',22l)
56 p1 <- mongo.bson.
from.buffer(buf)
5758 buf <- mongo.bson.buffer.create()
'name
', '
huangxin
') '
age',22l)
61 p2 <- mongo.bson.
from.buffer(buf)
6263 buf <- mongo.bson.buffer.create()
'name
', '
huangxin
') '
age',22l)
66 p3 <- mongo.bson.
from.buffer(buf)
6768
print(system.time(mongo.insert.batch(mongo,ns,list(p1,p2,p3))))
6970
print(
'找到剛剛批量插入的記錄
')
71print(system.time(cursor <- mongo.find(mongo,ns,list(
'name
'= '
huangxin
'))))
7273 i <- 0
74while(mongo.cursor.next(cursor))
75
78print(i)
7980
print(
'批量更新
')
81print(system.time(mongo.update(mongo,ns,list(name=
'huangxin
'),list(
'name
'= '
kym'))))
8283
print(
'檢視更新是否成功
')
84print(system.time(p <- mongo.find.one(mongo,ns,list(
'name
'= '
kym'))))
85if(!
is.null(p))
86
8990
print(
'批量刪除
')
91print(system.time(mongo.remove(mongo,ns,list(name=
'kym'))))
92 }
9394
print(system.time(p <- mongo.find.one(mongo,ns,list(
'name
'= '
kym'))))
95if(!
is.null(p))
96
[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對MongoDB的效能測試 RMongo
在九月初的時候,rmongodb正式發布了修訂版本,這也就意味著,從事數值計算的語言也可以於nosql產品相接軌了,但是鑑於我身邊並沒有公司真的在使用r和mongodb的結合,所以在效率問題上,我們也不敢掉以輕心,所以就做了乙個這樣的測試。測試環境是8核,64位機。用於測試的庫是乙個未經shardi...
R語言 理解R效能
通過了解限制r計算效能的因素,從而更好的利用起r的效能,影響r的因素 cpu,ram,磁碟i o,演算法。所以,當資料量小時,計算複雜度高,會受到cpu影響。資料量大時,會受到磁碟i o還有ram的影響。r是解釋型語句,即每次執行r程式的時候,r 需要重新解釋翻譯成機器 即使 不變。因為每次執行時,...
R 測試向量相等
假設我們要測試兩個向量是否相等,使用 的樸素方法將不可行 x 1 3 y c 1,3,4 x y 1 true false false 發生什麼了?問題在於,我們處理的是向量化。與r中其他運算子一樣,是乙個函式。事實上,是乙個向量化的函式。語句x y是將函式 應用到x和y的每一組元素上,得到乙個布林...