2012-01-19 5 views
0

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

{ш: word1 # word2, с: число}

У меня есть индекс на «ш» и я обновление счетчиков для каждая пара встретить при использовании запроса:

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

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

Спасибо, Энтони

ответ

0

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

Также убедитесь, что весь индекс на «w» может поместиться в ОЗУ, а также в большинстве документов. Если mongo необходимо прочитать с диска, чтобы обновить документы, он будет очень медленным в зависимости от ваших дисков.

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

  • сделать некоторые из подсчета на стороне клиента (с помощью HashMap), а затем вставить в конце каждой обработки документов.
  • вы можете попробовать карту уменьшить. Вы выиграете в том, что он выполнен в db. Но это требует выполнения javascript, который, вероятно, будет медленнее в конце. Появляется структура агрегации и усовершенствования MR в монго 2.2. Они оба просты в использовании, когда вы пробуете.
+0

Если я правильно вас понимаю, я считаю, что делаю точное совпадение в своем поле «w», когда каждый раз я создаю пару слов (word1 # word2, где word1 лексикографически предшествует word2). И мне нравится идея сначала хранить отсчеты на карте, а затем вставлять! Это должно сократить количество запросов. –

+0

Также, как я могу проверить, соответствует ли весь мой индекс «w» в ОЗУ? –

+0

Вы можете видеть каждый размер индекса из db.collection.stats() – ajg

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