Node.js: 如何从内存中释放 Mongoose 模型? (内存泄漏)
Node.js: How to release Mongoose model from memory? (memory leak)
模型访问后如何从内存中释放?我正在使用 global.gc()
和 --expose-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 通过 属性 mongoose 或连接(取决于您用来声明模型的方式)公开模型和模式缓存:
[mongoose or connection ].models
// 一个对象
[mongoose or connection ].modelSchemas
// 一个对象
每个都是一个使用声明的模型名称作为 属性 名称的对象。如果你想手动收集垃圾,你可以 delete
每个模型。
这些行起到了作用,让我恢复了所有记忆:
delete db.models[collection];
delete db.collections[collection];
delete db.base.modelSchemas[collection];
模型访问后如何从内存中释放?我正在使用 global.gc()
和 --expose-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 通过 属性 mongoose 或连接(取决于您用来声明模型的方式)公开模型和模式缓存:
[mongoose or connection ].models
// 一个对象
[mongoose or connection ].modelSchemas
// 一个对象
每个都是一个使用声明的模型名称作为 属性 名称的对象。如果你想手动收集垃圾,你可以 delete
每个模型。
这些行起到了作用,让我恢复了所有记忆:
delete db.models[collection];
delete db.collections[collection];
delete db.base.modelSchemas[collection];