使用MongoDB节点驱动程序导入一百万个文档时,节点进程的大量内存使用

时间:2016-07-31 18:41:56

标签: node.js mongodb

我正在使用 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);
}

})

1 个答案:

答案 0 :(得分:1)

节点内存管理是懒惰的,默认情况下,当它达到~1.3 / 1.4 Gb内存时会执行gc。目标是尽可能减少gc,因为它是一个I / O阻塞操作。

所以这很正常。

您可以尝试设置标记:--max_old_space_size=500node --max_old_space_size=500 app.js 这应该告诉节点做一个大约500 / 600mb的内存使用GC。如果你在那个数字附近,你没有内存泄漏,只有懒惰的GC。如果它开始崩溃,你可能会泄漏。