Как курсор драйвера PHP MongoDB буферизует результирующий набор?

#php #mongodb #php-internals

#php #mongodb #php-internals

Вопрос:

Когда выполняются запросы к mongodb, как курсор обрабатывает результирующий набор в памяти? Извлекает ли курсор все документы, соответствующие запросу, сразу? или он извлекает по 1 документу за раз? или они буферизованы? или есть другое решение, о котором я не знаю?

Если это буферизованное решение, как они хранятся на сервере / клиенте? Сколько данных клиент хранит локально?

Комментарии:

1. Память — какая память, серверная или клиентская? Курсор никогда не извлекает документы, это курсор. Буферизуется — опять же, где? На клиенте или сервере? Или вас интересует только клиент, начиная с PHP?

2. На самом деле, и то, и другое. Я полагаю, что сервер должен где-то хранить результат. И, может быть, я запутался в задании курсора — но курсор действует как мой «шлюз» к данным, поэтому он должен откуда-то их получать, и это где-то должно их хранить. Я просто пытаюсь узнать / выяснить, где хранятся данные и как к ним обращается / буферизует PHP-клиент.

3. Курсор позволяет клиенту перемещаться по результирующему набору, доступному на сервере. Итак, вы запрашиваете 500 документов, серверу нужно только сказать, вот курсор. клиент благодарит, а затем использует курсоры для перехода к чему-либо в пределах этого набора. Затем клиент говорит: Дайте мне документ в том месте, куда указывает курсор. Сервер говорит: хорошо, я знаю этот курсор, поэтому могу предоставить вам документ. По крайней мере, так я понимаю курсор. Сам курсор никогда не извлекается, но используется для обмена данными между клиентом и сервером.

4. Внутренние компоненты здесь: cursor.c

Ответ №1:

Протокол MongoDB wire имеет спецификации для размера пакета при выдаче запроса.

Основная предпосылка заключается в том, что клиентский драйвер выдает запрос с numberToReturn флагом. Если запрос совпадает с numberToReturn , то клиенту возвращается только это число.

Таким образом, сервер эффективно отправляет клиенту один «пакет». Если клиент циклически просматривает весь пакет, клиент выдает запрос getmore и получает следующий пакет. В то же время серверу не нужно загружать все результаты в память, достаточно только удовлетворить запрос клиента.

Драйвер PHP устраняет большую часть этой сложности. Все, что вы делаете с драйвером, это запрашиваете следующий элемент, и драйвер обработает его getmore там, где это уместно.

С точки зрения размера, вы получите меньший из максимального размера BSON или numberToReturn . Поэтому, если документы слишком большие, вы можете установить максимальный размер BSON, чтобы предотвратить отправку слишком большого количества данных одновременно.

Лучшее место для получения дополнительной информации — это сам код.