Возврат ЛОТЫ предметов из MongoDB через Node.js - PullRequest
2 голосов
/ 28 ноября 2011

Я возвращаю МНОГО (500k +) документов из коллекции MongoDB в Node.js.Это не для отображения на веб-сайте, а скорее для данных, хруст некоторых цифр.Если я возьму ВСЕ эти документы, система зависнет.Есть ли лучший способ получить все это?

Я думаю, что нумерация страниц может сработать?

Редактировать: Это уже за пределами цикла событий основного узла node.js, поэтому "система зависает""не не означает" входящие запросы не обрабатываются "

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Узнав больше о вашей ситуации, у меня появилось несколько идей:

  1. Делайте как можно больше в функции Map / Reduce в Mongo - возможно, есливы выбрасываете в Node меньше данных, которые могли бы стать решением.

  2. Возможно, столько данных съедает всю вашу память в вашей системе.Ваше "зависание" может быть V8, останавливая систему, чтобы выполнить сборку мусора (см. Этот вопрос SO) .Вы можете использовать флаг V8 --trace-gc для регистрации GC и доказать эту гипотезу.(спасибо еще один SO-ответ о V8 и сборке мусора

  3. Разбивка на страницы, как вы и предлагали, может помочь. Возможно, даже разделение ваших данных еще дальше в рабочие очереди (создатьодно рабочее задание со ссылками на записи 1-10, другое со ссылками на записи 11-20 и т. д.) В зависимости от ваших расчетов

  4. Возможно, предварительная обработка ваших данных - т.е. намного меньше данных для каждой записи. Или не использовать ORM для этого конкретного расчета, если вы используете его сейчас. Убедиться в том, что каждая запись содержит только те данные, которые вам нужны, означает меньше данных для передачи и меньшепамяти, в которой нуждается ваше приложение.

2 голосов
/ 28 ноября 2011

Я бы поставил вашу задачу «большой выборки + процесс» в рабочую очередь, фоновый процесс или механизм разветвления (здесь много разных опций).

Таким образом, вы выполняете свои расчеты вне основного цикла обработки событий и можете свободно обрабатывать другие запросы. В то время как вы должны выполнять поиск Mongo в обратном вызове, сами вычисления могут занять время, таким образом, «замораживая» узел - вы не дадите ему перерыв для обработки других запросов.

1 голос
/ 28 ноября 2011

Поскольку они вам не нужны в одно и то же время (это то, что я понял из того, что вы спрашиваете о нумерации страниц), возможно, лучше разделить эти 500 тыс. Штук на более мелкие куски, которые будут обрабатываться в nextTick ?

Вы также можете использовать что-то вроде Kue , чтобы поставить в очередь чанки и обработать их позже (таким образом, не все одновременно).

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