2011-05-05 2 views
5

mongodb에 대한 질의가 수행 될 때, 결과 집합을 메모리에 어떻게 다루는가? 커서가 쿼리와 일치하는 모든 문서를 즉시 검색합니까? 또는 한 번에 하나의 문서를 검색합니까? 또는 그들은 버퍼링됩니까? 또는 내가 모르는 다른 해결책이 있습니까?PHP MongoDB Driver의 Cursor 버퍼는 결과 집합을 어떻게 버퍼링합니까?

버퍼링 된 솔루션 인 경우 서버/클라이언트에 어떻게 저장됩니까? 클라이언트는 얼마나 많은 데이터를 로컬에 보관합니까?

+0

메모리 - 메모리, 서버 또는 클라이언트? 커서는 문서를 검색하지 않으며 커서입니다. 버퍼 된 - 다시 어디에서? 클라이언트 또는 서버에서? 또는 PHP로만 클라이언트에 관심이 있습니까? – hakre

+0

둘 다. 서버가 결과를 어딘가에 저장해야한다고 생각합니다. 커서의 작업에 대해 혼란 스러울 지 모르지만 커서가 데이터에 대한 "게이트웨이"역할을하므로 어딘가에서 가져와야하며 어딘가에 저장해야합니다. 나는 단지 데이터가 저장되는 위치와 PHP 클라이언트가 액세스/버퍼링하는 방법을 배우거나 파악하려고 시도하고 있습니다. –

+0

커서를 사용하면 클라이언트가 서버에서 사용할 수있는 결과 집합을 탐색 할 수 있습니다. 그래서 500 개의 문서를 쿼리하면, 서버는 여기 커서 만 말할 필요가 있습니다. 클라이언트는 감사의 말을하고 커서를 사용하여 해당 집합 내의 어딘가를 탐색합니다. 그러면 클라이언트는 다음과 같이 말합니다. 커서가 가리키는 곳에서 문서를 보내주십시오. 서버는 말한다 : 커서를 잘 알아서 문서를 줄 수있다. 적어도 그것이 커서를 이해하는 방법입니다. 커서 자체는 가져 오지 않지만 클라이언트와 서버 간의 통신에 사용됩니다. – hakre

답변

5

MongoDB wire protocol에는 쿼리를 실행할 때 배치 크기에 대한 사양이 있습니다.

기본 전제는 클라이언트 드라이버가 numberToReturn 플래그로 쿼리를 실행한다는 것입니다. 쿼리가 numberToReturn에서 일치하면 해당 번호 만 클라이언트에 반환됩니다.

따라서 서버는 효과적으로 "배치"하나를 클라이언트에 보냅니다. 클라이언트가 전체 배치를 순환하면 클라이언트는 getmore 요청을 발행하고 다음 배치를받습니다. 한편, 서버는 모든 결과를 메모리에로드 할 필요는 없으며 클라이언트의 요청을 충족시킬만큼 충분합니다.

PHP 드라이버는 이러한 복잡성을 대부분 추상화합니다. 운전 기사와 함께 할 일은 다음 항목을 요청하는 것이고, 운전자는 적절한 경우 getmore을 처리 할 것입니다.

크기면에서 최대 BSON 크기 또는 numberToReturn 중 작은 값을 얻게됩니다. 따라서 문서가 너무 크면 한 번에 너무 많은 데이터를 보내지 못하도록 최대 BSON 크기를 기록 할 수 있습니다.

자세한 내용을 확인하는 가장 좋은 방법은 the actual code입니다.

관련 문제