2011-01-10 4 views
0

MongoMapper에서 큰 데이터 세트를 조작하기위한 권장 방법은 무엇입니까? 이 예에서 Model에는 대략 10,000 개의 레코드가 있습니다.Model.collection.find ({}). to_a가 MongoMapper의 Model.all보다 10 배 이상 빠른 이유는 무엇입니까?

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 

답변

2

것은 몽고 매퍼 Model.all 먼저 메모리에 모든 레코드를로드 한 후 매우 느린 레코드의 각 개체를 구축하고 있기 때문에.

MyModel.find_each를 사용하면 커서를 사용하여 한 번에 모든 레코드를로드하는 대신 MyModel.find_each를 사용하여 약간의 대기 시간을 완화 할 수 있습니다. 또는 쿼리의 : fields 한정자를 사용하여 반환 된 데이터를 제한하고 작동하지만 MongoMapper를 사용하는 많은 수의 문서에서 꽤 고통 스러울 수 있습니다.

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

일종의 일괄 처리를 실행하는 경우 가능한 경우 드라이버를 직접 사용하려고합니다.

관련 문제