Как сгруппировать более 20000 уникальных ключей? - PullRequest
1 голос
/ 07 января 2012

У меня есть 2 примера:

results = coll.group( key={"ip": 1, "id" : 1 }, condition= {}, initial={},
reduce="function(obj,prev) {}" )
print len(results)

и:

map = Code(
"function () {"
"emit({ id: this.id, ip: this.ip}, {count: 1});"
"}"
)

reduce = Code("function (key, values) {""}")
result = coll.map_reduce(map, reduce, "map_reduce_example")
print result.count()

Почему второй пример медленнее, чем первый?Я хочу использовать 2 примера вместо 1 примера, потому что 1 пример не работает для более чем 20000 уникальных ключей.

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Новая структура агрегации MongoDB , вероятно, решит ваши проблемы, но до тех пор Я предлагаю запускать карту / сокращение в качестве регулярно запланированного фонового задания и запрашивать коллекцию, полученную из карты / сокращения, в режиме реального времени. . Это значительно ускорит результаты группового подсчета, но подсчет может быть немного устаревшим (в зависимости от того, когда в последний раз выполнялось уменьшение фоновой карты).


Пояснение:

Карта / уменьшение MongoDB намного медленнее, чем group () по нескольким причинам:

  • Промежуточные преобразования: BSON -> JSON -> BSON -> JSON -> BSON (MongoDB хранит данные в двоичном BSON, но JavaScript map () и lower () должны быть снабжены текстовым JSON)
  • Функции JavaScript Javascript map () и reduce () должны интерпретироваться однопоточным механизмом JavaScript

Собственные функции агрегации C в MongoDB намного быстрее, но одно из их ограничений заключается в том, что весь вывод должен соответствовать одному документу BSON (в настоящее время 16 МБ). Именно поэтому существует ограничение на количество уникальные ключи.

Среда агрегации MongoDB объединит в себе лучшее из обоих методов:

  • Собственное исполнение для скорости
  • Нет преобразования BSON в / из JSON
  • Результаты можно отправлять в коллекцию, минуя ограничения, установленные одним документом.

Фреймворк уже задокументирован и доступен в версиях разработки MongoDB . Фреймворк планируется к выпуску в феврале 2012 года.

1 голос
/ 07 января 2012

Когда вы запускаете map / lower, ваши функции map и reduce выполняются во время выполнения javascript (что медленнее, чем собственный код C ++). Это также включает некоторую блокировку (блокировки JS, блокировки чтения, блокировки записи).

group, с другой стороны, может выполняться более эффективно (больше нативного кода, меньше блокировок и т. Д.).

Обратите внимание, что в закрытой среде карта / уменьшение - ваш единственный вариант на данный момент (в будущих версиях вы сможете использовать Aggregation Framework).

...