33415090
参考上一篇博客,测试mongodb集群,插入4千万数据的报告:
https://cnodejs.org/topic/5518a873687c387d2f5b2953
起初打算用Node.js去做这个性能 测试,碰了几次壁后,改用Python顺利完成任务,现在回过头来再看这个问题,发现里面似乎有坑。
先放上一段Node.js的插入10万条记录的代码:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://127.0.0.1:27017/testdb';
var dataList = []
var globalCount = 0
console.time('insert,10w');
MongoClient.connect(url, {
server: {
poolSize: 50
}
},function(err, db) {
if(err) throw(err)
for(var i=0; i<100000; i++){
db.collection('test1').insert({
count:i
}, function(err, r) {
if(err) throw(err)
globalCount++
if(globalCount>=100000){
console.timeEnd('insert,10w');
process.exit(1);
}
});
}
});
测试结果慢的令人发指,Node.js版本是最新的0.12.2
E:\nodejs>node mongodb_error2.js
insert,10w: 9791ms
我用同样的Python脚本去做:
import pymongo
import json
import datetime,time
import copy
import sys, os
def getTimestampFromDatetime(d=None):
if d is None:
d = datetime.datetime.now()
return time.mktime(d.timetuple())
if __name__ == '__main__':
start = getTimestampFromDatetime()
client = pymongo.MongoClient("localhost", 27017, max_pool_size=50)
db = client.testdb
saveData = []
for i in range(0, 100000):
saveData.append({
'count':i
})
db.test2.insert(saveData)
end = getTimestampFromDatetime()
print('time: {0}s'.format(end-start))
测试结果如下:
E:\python>python save_10w.py
time: 1.0
我在想是不是Node.js代码写的太垃圾,于是我找了Mongodb包的另外一个insertMany方法,但是结果却报错了:
E:\nodejs\node_modules\mongodb\lib\utils.js:97
process.nextTick(function() { throw err; });
^
Error
at Object.<anonymous> (E:\nodejs\node_modules\mongodb\node_modules\mongodb-c
ore\lib\error.js:42:24)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (E:\nodejs\node_modules\mongodb\node_modules\mongodb-core\index.js:2:17)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
下图是Node.js插入10万条后,数据库的截图
下图是Python插入10万条后,数据库的截图
可以看到数据库里都有10万条数据了,两者都成功的插入了,并且大小都一样,求大神指教,这个怎么破?