我正在使用 MongoDB:3.0.6 Mongo的节点驱动程序
我必须将一百万个文件导入Mongo。我创建了1000个文档的数组,并调用insertMany()来批量插入它们。该过程在~70秒内完成
在发生这种情况时,我发现节点进程内存使用率从大约100MB到大约800MB左右。
那是记忆泄漏吗?如果是,我该如何识别内存泄漏? 如果没有,这种行为的解释是什么?
编辑:以下是我使用的代码。
var csv = require('csv'),
fs = require('fs'),
Q = require('q'),
MongoClient = require('mongodb').MongoClient;
var COLLECTION_NAME = 'transactions';
var insertDocument = function(db, doc) {
return db.collection(COLLECTION_NAME).insertMany(doc);
};
MongoClient.connect("mongodb://localhost:" + 27017 + "/integration", function(err, db) {
if (!err){
console.time("Import Time");
var csvParser = csv.parse({
columns: true,
trim: true
});
csvParser.payload = [];
var promisesArray = [],
batchReadCount = 0;
csvParser.on('readable', function() {
var data = csvParser.read();
if (data !== null) {
csvParser.payload.push(data);
batchReadCount++;
}
if (batchReadCount == 1000) {
promisesArray.push(insertDocument(db, csvParser.payload));
batchReadCount = 0;
csvParser.payload = [];
}
});
csvParser.on('end', function() {
if (csvParser.payload.length > 0) {
promisesArray.push(insertDocument(db, csvParser.payload));
}
Q.all(promisesArray).then(function(result) {
console.timeEnd("Import Time");
docdb.close();
}, function(error) {
console.log(error);
console.timeEnd("Import Time");
});
});
var readStream = fs.createReadStream('million.csv');
readStream.pipe(csvParser);
}
})
答案 0 :(得分:1)
节点内存管理是懒惰的,默认情况下,当它达到~1.3 / 1.4 Gb内存时会执行gc。目标是尽可能减少gc,因为它是一个I / O阻塞操作。
所以这很正常。
您可以尝试设置标记:--max_old_space_size=500
即node --max_old_space_size=500 app.js
这应该告诉节点做一个大约500 / 600mb的内存使用GC。如果你在那个数字附近,你没有内存泄漏,只有懒惰的GC。如果它开始崩溃,你可能会泄漏。