2016-07-31 46 views
-1

我使用MongoDB的 一万份文件:3.0.6 节点驱动程序蒙戈海量内存的使用,同时导入使用MongoDB的节点驱动

我要导入万份文件到蒙戈。我创建了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

很难说,没有任何实际的代码看 – noppa

+0

是的,你应该发布你的代码,所以我们可以提供帮助。 – alexi2

回答

1

节点的内存管理是懒惰的,默认情况下它会做一个GC,当它达到〜1.3/1.4 G的内存。我们的目标是尽可能减少gc,因为它是一种I/O阻塞操作。

所以这可能是正常的。

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

+0

感谢您的信息。有了上述标志,我发现一旦节点达到〜500MB,整个导入过程就会减慢。 – bhates

+0

但节点进程不会崩溃。 – bhates

相关问题