Нет, нет никаких настроек, и если вы действительно думаете об этом, для этого есть веская причина. Итак, если вы сначала подумаете, что делает агрегат и что делает MongoDB в целом, должно стать ясно.
Вот что "должно" быть в "голове" любого разумного конвейера агрегации:
db.collection.aggregate([
{ "$match:{ /* Something here */ } },
А это причины:
Разумно попытаться уменьшить рабочий набор, с которым вы работаете, в любой операции.
Кроме того, это единственный случай, когда у вас есть возможность использовать индекс для облегчения поиска по выбору. Что всегда лучше, чем сканирование коллекции.
Несмотря на то, что существует встроенный "оптимизатор", который ищет такие вещи, как "проекции", ограничивающие "выбранные" поля, лучший контролер размера рабочего набора должен только работать с действующими записями. Сопоставления более поздних этапов не оптимизированы таким образом (см. пункт 1).
Следующее, что нужно учитывать, — это общее поведение MongoDB. Так что серверный процесс хочет сделать, это "использовать" как можно больше много доступной машинной памяти, чтобы удерживать " "рабочий набор" данных (коллекции и/или индекс), чтобы "работать" с этими данными наиболее эффективными средствами.
Таким образом, действительно в "наилучших интересах" ядра базы данных "расходовать" большую часть выделяемой памяти таким образом. Таким образом, как ваше агрегатное задание, так и все другие параллельные процессы имеют доступ к "рабочим данным" в пространстве памяти.
Таким образом, для MongoDB «не оптимально» «красть» это выделение памяти из других параллельных операций просто для обслуживания вашей текущей агрегации. операция.
С точки зрения "программирования в соответствии с требованиями к оборудованию", вы знаете, что будущие выпуски позволяют конвейеру агрегации реализовывать "использование диска" для увеличения объема обработки. Вы всегда можете использовать SSD или другие быстрые технологии хранения. И, конечно же, "10%" оперативной памяти зависит от объема оперативной памяти, установленной в системе. Так что вы всегда можете увеличить это значение.
Суть в том, что MongoDB выполняет работу как "параллельное хранилище данных" и делает это хорошо. То, что не является, является конкретным "агрегированием job-runner" и не должно рассматриваться как таковое.
Так что либо "разбейте" ваши рабочие нагрузки, либо увеличьте спецификации вашего оборудования, либо просто переключите большую активность "запуска задачи" на что-то, что делает сосредоточьтесь на текущей задаче, такой как mapReduce в стиле Hadoop, и предоставьте MongoDB ее работу по обслуживанию данных.
Или, конечно, измените свой дизайн, чтобы просто "предварительно агрегировать" необходимые данные где-нибудь "при записи".
Как говорится, «Лошади для курсов» или используйте свои инструменты для того, для чего они разработаны.
person
Neil Lunn
schedule
29.03.2014