Используя rails 3 и mongoDB с адаптером mongoid, как я могу найти партию mongo? Мне нужно захватить все записи в конкретной коллекции БД Монго и индексировать их в solr (начальный индекс данных для поиска).
Проблема, с которой я сталкиваюсь, заключается в том, что Model.all захватывает все записи и сохраняет их в памяти. Затем, когда я обрабатываю их и индексирую в solr, моя память съедается, и процесс умирает.
То, что я пытаюсь сделать, это пакетная находка в монго, чтобы я мог перебирать более 1000 записей за один раз, передавать их в solr для индексации, а затем обрабатывать следующую 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. Я вижу много документации по выполнению пакетных вставок, но не для пакетного поиска.