Node.js:如何释放Mongoose模型内存?(内存泄漏)

4
如何在访问模型后将其从内存中释放?我正在使用--expose-gc选项的global.gc(),以查看它是否占用了我的内存。
以下代码创建了10000个集合:
// mongoose connection
var db = mongoose.createConnection(...);

// amount of collections
var amount = 10000;

// create collections (100/per second)
var sync = async.queue(function(n, cb) {
    var schema = new mongoose.Schema({
        data: mongoose.Schema.Types.Mixed
    });
    var collection = 'model_'+n;
    var model = db.model(collection, schema);
    setTimeout(function() { cb(); }, 10);
}, 1);

// push to queue
for(var i=0; i<amount; i++) {
    sync.push(i);
}

// done
sync.drain = function(err) {
    console.log('all '+amount+' models done');
};

// garbage collector (every second)
setInterval(function() {
    try { global.gc(); } catch(gcerr) { }
}, 1000);

随着集合的创建,内存使用量会增加且永远不会释放:

1 - Memory used: 30 MB
2 - Memory used: 36 MB
3 - Memory used: 42 MB
4 - Memory used: 48 MB
5 - Memory used: 54 MB
6 - Memory used: 61 MB
7 - Memory used: 65 MB
8 - Memory used: 71 MB
9 - Memory used: 77 MB
10 - Memory used: 82 MB
all 10000 models done
11 - Memory used: 86 MB
12 - Memory used: 86 MB

有没有办法在不关闭连接的情况下手动清除内存中的模型? 找到解决方案
delete db.models[collection];
delete db.collections[collection];
delete db.base.modelSchemas[collection];

你为什么想要清除内部模型缓存?Mongoose使用它来执行像在“population”操作中的取消引用等操作。 - Jason Cust
问题是,完成后如何释放Mongoose占用的内存。 - fedu
正如您所指出的:如果您完成了操作,则关闭连接以清除附加到其上的模型。但是,如果您需要保持连接处于打开状态而没有模型,请参见我的答案 - Jason Cust
2个回答

2
翻译如下:
Mongoose 通过 mongoose 或 connection 属性暴露模型和模式缓存(取决于您用哪个声明模型):
[mongoose 或 connection].models // 一个对象
[mongoose 或 connection].modelSchemas // 一个对象
每个都是一个对象,使用声明的模型名称作为属性名称。然后,如果要手动进行垃圾回收,您可以 delete 每个模型。

谢谢,但是 delete db.models[collection]; 似乎只删除了一半的内存,并且关闭连接也没有任何作用。这可能实际上是 Mongoose v4.0.1 中的一个 bug。我正在 GitHub 上讨论它。 - fedu
@fedu 模式是另一半,这就是为什么我在上面提到了它们两个。所以我不确定为什么这不起作用。无论如何,只要有效即可。 :) - Jason Cust

0

这些代码行起到了奇效,让我恢复了所有的内存:

delete db.models[collection];
delete db.collections[collection];
delete db.base.modelSchemas[collection];

2
你需要在代码的哪个位置和时间添加这些行? - Nikhil Nanjappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接