在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
答案 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
如果您正在运行某种批量操作,我会尝试直接使用驱动程序,如果可以的话。