#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, чтобы предотвратить отправку слишком большого количества данных одновременно.
Лучшее место для получения дополнительной информации — это сам код.