2012-01-06 2 views
1

У меня есть 2 примера:Как сгруппировать более 20000 ключ uniq?

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 ключей uniq.

+0

Существует третий вариант (скоро): новая структура агрегации MongoDB (http: //www.10gen.ком/презентация/mongosv-2011/mongodbs-новая агрегация рамка). – Leftium

ответ

1

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

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

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

3

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


Объяснение:

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

  • промежуточные преобразования: BSON -> JSON -> BSON -> JSON -> БСО N (MongoDB хранит данные в двоичном BSON, но карта JavaScript() и уменьшить() должны быть поданы текстовые JSON)
  • Java-функции карты() и уменьшения() должны быть интерпретированы однопоточных двигателя JavaScript

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

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

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

Рамки уже documented и available in development versions of MongoDB. Рамка запланирована на выпуск продукции в феврале 2012 года.

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