为什么Model.collection.find({})。to_a比MongoMapper中的Model.all快10倍?

时间:2011-01-10 19:52:22

标签: ruby performance mongodb

在MongoMapper中操作大型数据集的推荐方法是什么?在此示例中,Model大约有10,000条记录。

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 个答案:

答案 0 :(得分:2)

因为mongo mapper中的Model.all首先将所有记录加载到内存中,然后为每个记录构建对象,所以它很慢。

您可以通过使用MyModel.find_each使用游标迭代记录,而不是一次性加载所有记录,或者使用查询中的:fields修饰符来限制返回的数据,但可以稍微减少延迟使用MongoMapper的大量文档可能非常痛苦。

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

如果您正在运行某种批量操作,我会尝试直接使用驱动程序,如果可以的话。