Количество слов в MongoDB - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь создать коллекцию подсчетов совпадений для обработанного простого текста в Википедии. Я использую Java API для MongoDB, и моя структура документа довольно проста:

{w: word1 # word2, c: count}

У меня есть индекс "w", и я обновляю счетчики для каждой пары, с которой сталкиваюсь, используя запрос:

coll2.update(new BasicDBObject("w",word), new BasicDBObject("$inc",new BasicDBObject("c",1)),true,false);

Есть ли какие-либо другие способы оптимизации, которые я мог бы сделать, чтобы ускорить процесс подсчета слов? Сейчас у меня около 27 миллионов пар слов, и из терминала «mongod» я вижу бесконечный поток запросов, от 100 до 1000 мс (который я считаю «медленным»). Благодаря моему Google'у подход MapReduce кажется обычным способом решения проблем с большим количеством слов. Но я не очень разбираюсь в MapReduce и, исходя из своего базового понимания, мне понадобится более одной машины (которой у меня нет).

Спасибо, Anthony

1 Ответ

0 голосов
/ 20 января 2012

Теоретически ваш подход хорош, если вы точно соответствуете полю "w". Если вы используете регулярное выражение или другое, индекс может использоваться неэффективно. Вы можете запустить эквивалентную команду find с помощью объяснения (), чтобы проверить поведение индекса.

Также убедитесь, что весь индекс "w" может уместиться в оперативной памяти, а также в большинстве документов. Если для обновления документов mongo необходимо прочитать с диска, это станет очень медленным в зависимости от ваших дисков.

Потенциальный обходной путь:

  • выполнить подсчет на стороне клиента (используя хэш-карту), а затем вставить в конце обработки каждого документа.
  • Вы можете попробовать уменьшить карту. Вы получите в том, что он выполняется в БД. Но это требует выполнения JavaScript, который, вероятно, будет медленнее в конце. Далее идет структура агрегации и улучшения MR в монго 2.2. Они оба просты в использовании, когда вы попробуете.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...