2016-10-08 3 views
1

Я использую агрегат mongodb для отбора документов из большой коллекции.Накопитель Mongodb из памяти

https://docs.mongodb.com/manual/reference/operator/aggregation/sample/

После выполнения нескольких последовательных вызовов, я вижу, память MongoDB восхождение вверх, и после того, как около 12 вызова, он выходит из строя с OutOfMemory ошибки.

Как я могу сообщить Mongodb освободить память после того, как она завершила обработку запроса?

ответ

1

Причина, по которой вы просите об этом, заключается в том, что вы не знаете, как работает оператор $sample. Как уже упоминалось в documentation,

Для того, чтобы получить N случайных документы:

  • Если N больше или равно 5% от общего количества документов в коллекции, $ пробы выполняет сбор сканировать, выполняет сортировку, а затем выбирает верхние N документов. Таким образом, стадия $ sample подчиняется sort memory restrictions.

  • Если N составляет менее 5% от общего количества документов в коллекции, При использовании WiredTiger Storage Engine в образце $ образец использует случайный курсор над коллекцией для выборки N документов. При использовании MMAPv1 Storage Engine в образце $ sample используется индекс _id для случайного выбора N документов.

Так что я думаю, что число случайных документов, которые вы хотите получить больше, чем на 5%. Вам необходимо установить allowDiskUse на номер True.

collection.aggregate(pipeline, allowDiskUse=True) 
+0

Спасибо, я попробовал это, но выясняется, что проблема связана с размером кеша файловой системы, который по умолчанию установлен на слишком большое число. – siamii

0

Оказывается, проблема была в кеше ядра хранилища. Я использую экземпляр EC2, и это привело к ошибке OOM. Я был в состоянии решить эту проблему, назначая меньший размер кэша, как это:

mongod --dbpath /a/path/to/db --logpath /a/path/to/log --storageEngine wiredTiger --wiredTigerEngineConfigString="cache_size=200M" --fork