Поиск записей mongoDB партиями (с использованием адаптера mongoid ruby)

Используя rails 3 и mongoDB с адаптером mongoid, как я могу загружать данные в базу данных mongo? захватить все записи в конкретной коллекции БД mongo и проиндексировать их в solr (начальный индекс данных для поиска).

Проблема, с которой я столкнулся, заключается в том, что выполнение Model.all захватывает все записи и сохраняет их в памяти. Затем, когда я обрабатываю их и индексирую в solr, моя память съедается, и процесс умирает.

Я пытаюсь выполнить пакетную операцию поиска в mongo, чтобы я мог перебирать более 1000 записей за раз, передать их нужно преобразовать в индекс, а затем обработать следующие 1000 и т. д.

Код, который у меня сейчас есть, делает следующее:

Model.all.each do |r|
  Sunspot.index(r)
end

Для коллекции, содержащей около 1,5 миллионов записей, это съедает 8+ ГБ памяти и убивает процесс. В ActiveRecord есть метод find_in_batches, который позволяет мне разбивать запросы на управляемые пакеты, сохраняя память для м выходит из-под контроля. Однако я не могу найти ничего подобного для mongoDB / mongoid.

Я ХОТЕЛ бы иметь возможность делать что-то вроде этого:

Model.all.in_batches_of(1000) do |batch|
  Sunpot.index(batch)
end

Это облегчило бы мои проблемы с памятью и трудности с запросами, решив только управляемую проблему ставить каждый раз. Однако документация по пакетному поиску в mongoDB скудна. Я вижу много документации по выполнению пакетной вставки, но не пакетного поиска.

39
задан ekad 31 December 2017 в 12:31
поделиться