创建数据库时Nodejs内存泄漏

时间:2016-05-02 14:01:41

标签: node.js mongodb mongoose

以下代码将文件中的一些信息导出到MongoDb。

categories.forEach(function(category){
var path = dirpath + '/' + directory + '/category_' + category.id + '.csv';

var readStream = fs.createReadStream(path);
var readLine = readline.createInterface({
    input: readStream
});

var items = [];

(function(items,readLine){
    readLine.on('line', function (line) {
        items.push(mapItems(line.split(';')));

        if(items.length > 10000) {
            saveItems(items); //save chunk
            items.length = 0; //clear an array
        }
    });

    readLine.on('close', function () {
        saveItems(items);
        items.length = 0;
    });
})(items,readLine)
});

saveItems功能代码:

function saveItems(items){

schema.items.collection.insert(items, function (err) {
    if(err)
        console.log(err);
})

}

对于大文件(大约300mbs),此代码与process out of memory崩溃,尽管已清除items数组。谁能解释我为什么?

1 个答案:

答案 0 :(得分:1)

很难说。您可以尝试每几千行拍摄一次内存快照,并了解内存增长的原因,更多信息请点击此处:http://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/

您很可能无法将所有数据存储在内存中(您正在读取的大文件)。最有可能的是你必须以更易于管理的块(即一次1000行)分解它,然后插入那些较小的块并释放使用的内存。不幸的是,我不确定如何在MangoDB中做到这一点,所以你必须弄明白。