2012-04-26 1 views
0

나는 같은 커서를 몇 번 사용하여 객체를 반복하므로 객체를 메모리에 보관하는 것이 더 빠를 것이라고 가정합니다.몽고 객체를 커서로 반복하여 유지 한 후 메모리에 유지하기

objects = cursor.to_a과 함께 사용하기 전에 모든 객체를 배열에 넣으려고했으나 데이터가 다운로드 될 때까지 기다리는 동안 호출이 더 이상 계산을 차단하고 궁극적으로 속도가 느립니다.

내가 생각한 또 다른 방법은 계산을 할 때 배열에 문서를 추가 한 다음 추가 계산을 수행 할 배열을 사용하는 것입니다. 이것은 꽤 부정하고 유지하기가 어렵지만.

이미이 작업을 수행하는 코드가 있습니까?

+0

당신이 두 번째 솔루션은 당신이이 없기 때문에 유지하기 어렵다는 말한다면 첫 번째 "계산"루프, 당신은 개체를 캐싱에 대해 생각 해 봤나? 이렇게하면 모든 루프에서 이미 캐시에 개체가 있는지 확인하고 사용하는 경우 확인합니다. 항상 첫 번째 루프가있는 경우 말한대로 한 번의 계산을 수행 할 때마다 배열에 객체를 추가 할 수 있습니다. –

답변

1

그래서 이미 몽고이 (Mongoid)에서이 작업을 수행하는 방법이 있습니다. 쿼리마다 및 반복마다 캐시되므로 쿼리 할 때 실제로 데이터를 메모리에 유지하기 때문에 차단되지 않습니다.

이 커서에 불과 기능 그리고 당신은 다음과 같이 호출 할 수 있습니다 :

Model.where(:name => "John").cache

More info here: http://mongoid.org/docs/extras.html

+0

요청이 끝날 때이 캐시가 만료되는지 여부를 알고 계십니까? 문서는 말하지 않는 것 같습니다. 감사! –

0

시도는이 문서에서 찾을 수 identity_map, 더 자세한 내용을 사용 : http://mongoid.org/docs/installation/configuration.html

identity_map_enabled (거짓) : 자신의 식별자에 의해 신원지도의 데이터베이스에서로드 문서를 저장할 사실 Mongoid로 설정하면 , 같은 단위에있는 동일한 문서에 대한 후속 데이터베이스 쿼리는 작업 중 이 데이터베이스를 조회하지 않습니다. 이 순간에 의 관계 검색어에만 해당됩니다. 자세한 정보는 ID 맵 문서를 참조하십시오.

+0

ID 맵은 커서의 모든 객체를 반복하고 ID로 특정 객체를 선택하지 않기 때문에 도움이되지 않습니다. – Moox

0

다른 대안 : 배열에 id 부분 만 저장하십시오. Mongo::Cursor 자체는 해시가 아니지만 이해할 수있는 한 결과 집합의 포인터와 비슷합니다. 여기에 대한 자세한 내용 : Mongo Docs

관련 문제