Как я могу преобразовать каждый документ в большую коллекцию Mongodb без карты / уменьшить? - PullRequest
3 голосов
/ 29 декабря 2011

Извиняюсь за длинное описание.

Я хочу запустить преобразование для каждого документа в большой коллекции Mongodb с 10 миллионами записей около 10G. В частности, я хочу применить преобразование geoip к полю ip в каждом документе и либо добавить запись результата к этому документу, либо просто создать целую другую запись, связанную с этим, например, с помощью id (связывание не является критичным, я могу просто создать целая отдельная запись). Затем я хочу посчитать и сгруппировать по городам - ​​(я знаю, как сделать последнюю часть).

Основная причина, по которой я считаю, что я не могу использовать map-Reduce, заключается в том, что я не могу вызвать библиотеку geoip в своей функции карты (или, по крайней мере, это ограничение, которое, я считаю, существует).

Итак, главный вопрос в том, как мне выполнить каждую запись в коллекции, применить преобразование, используя наиболее эффективный способ сделать это.

Пакетная обработка через Limit / skip не подлежит сомнению, так как она выполняет «сканирование таблицы» и будет становиться все медленнее.

Есть предложения?

Python или Js предпочтительны только потому, что у меня есть эти библиотеки geoip, но примеры кода на других языках приветствуются.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Так как вам нужно пройти по "каждой записи", вы все равно выполните одно полное сканирование таблицы, тогда простой курсор (find()) + может быть, выбирает только несколько полей (_id, ip).Драйвер Python выполнит пакетирование под капотом, так что, возможно, вы сможете дать подсказку, какой оптимальный размер пакета (batch_size), если значение по умолчанию недостаточно хорошее.

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

0 голосов
/ 30 декабря 2011

На самом деле я также пытаюсь использовать другой подход параллельно (как план B), который должен использовать mongoexport. Я использую его с --csv, чтобы вывести большой CSV-файл только с полями (id, ip). Тогда планируется использовать скрипт на python для поиска в geoip, а затем отправить обратно в mongo в качестве нового документа, на котором теперь можно запустить map-Reduction для подсчета и т. Д. Не уверен, что это быстрее или курсором. Посмотрим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...