2015-04-14 4 views
3

Как выпустить модель из памяти после ее доступа? Я использую 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]; 
+0

Почему вы хотите, чтобы очистить внутреннюю кэш-память модели? Mongoose использует его для таких вещей, как разыменование в операциях «население». –

+0

Вопрос в том, как освободить память, которую Mongoose съел после того, как вы закончили. – fedu

+0

Как вы отметили: если вы закончили, закройте соединения, чтобы очистить прикрепленные к нему модели. Но если вам нужно поддерживать соединение открытым без моделей, см. [Мой ответ] (http://stackoverflow.com/a/29632852/3194372). –

ответ

0

Этих линии сделали трюк и получили всю мою память назад:

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

Mongoose выставляет модель и схему кэши через свойство либо мангуста или соединение (в зависимости от которого вы использовали, чтобы объявить модель):

[mongoose or connection ].models // объект

[mongoose or connection ].modelSchemas // объект

Каждый объект, который использует объявленное имя модели как имя свойства. Затем вы можете выбрать delete для каждой модели, если вы хотите вручную удалить мусор.

+0

Спасибо, но 'delete db.models [collection];' только, кажется, удаляет половину памяти, и закрытие соединения тоже ничего не делает. На самом деле это может быть ошибкой в ​​Mongoose v4.0.1. Я обсуждаю это в [GitHub] (https://github.com/Automattic/mongoose/issues/2874). – fedu

+0

Нашел мой ответ (см. Ниже), спасибо вам :) – fedu

+0

@fedu Схемы были другой половиной, поэтому я упомянул их обоим выше. Поэтому я не уверен, как это не сработает. Anywho, все работает. :) –

Смежные вопросы