Как выпустить модель из памяти после ее доступа? Я использую global.gc()
с опцией --expose-gc
, чтобы увидеть, что это есть моя память.Node.js: Как выпустить модель Mongoose из памяти? (утечка памяти)
Следующий код создает 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 съел после того, как вы закончили. – fedu
Как вы отметили: если вы закончили, закройте соединения, чтобы очистить прикрепленные к нему модели. Но если вам нужно поддерживать соединение открытым без моделей, см. [Мой ответ] (http://stackoverflow.com/a/29632852/3194372). –