Почему Model.collection.find ({}). To_a более чем в 10 раз быстрее, чем Model.all в MongoMapper? - PullRequest
0 голосов
/ 10 января 2011

Каков рекомендуемый способ управления большими наборами данных в MongoMapper?В этом примере Model имеет примерно 10000 записей.

ruby-1.8.7-p302 > 3.times { puts Benchmark.measure { Model.all } }
 13.560000   0.040000  13.600000 ( 13.670868)
 13.480000   0.040000  13.520000 ( 13.562469)
 13.500000   0.030000  13.530000 ( 13.576461)
 => 3 
ruby-1.8.7-p302 > 3.times { puts Benchmark.measure { Model.collection.find({}).to_a } }
  1.580000   0.010000   1.590000 (  1.603868)
  1.240000   0.030000   1.270000 (  1.268826)
  1.060000   0.010000   1.070000 (  1.072450)
 => 3

1 Ответ

2 голосов
/ 10 января 2011

Поскольку Model.all в mongo mapper сначала загружает все записи в память, а затем создает объекты для каждой из этих записей, это довольно медленно.

Вероятно, вы можете немного уменьшить задержку, используяMyModel.find_each для итерации записей с помощью курсора, вместо загрузки их всех сразу или с помощью модификатора: fields в вашем запросе для ограничения возвращаемых данных, но работа с большим количеством документов с использованием MongoMapper может быть довольно болезненной.

MyModel.find_each(:fields => [:include_this, :include_that]) do |mydoc|
   puts mydoc.include_this
end

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

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