PHP и Mongo - findOne () вызывает исчерпание памяти - PullRequest
12 голосов
/ 06 декабря 2011

Мой PHP memory_limit равен 64M (что довольно много для начала)

У меня есть вызов MongoCollection :: findOne (), который вызывается в моем PHP-коде, где я "нахожу один" с помощью MongoId.Это работает в большинстве случаев.Однако в некоторых случаях это приводит к тому, что PHP переходит предел памяти 64M.

Запись данных в Mongo имеет максимальный размер 3,5 МБ, поскольку Mongo не допускает более 4 МБ.

Когда яВыполните, memory_get_usage () перед вызовом findOne (), это всего около 4 МБ.Так что findOne (), похоже, потребляет другие 60 МБ +.Это утечка памяти или есть ошибка в дизайне, которую я храню в Mongo?

Мой драйвер PHP Mongo является самым последним 1.26

Ответы [ 4 ]

1 голос
/ 07 марта 2012

Было бы полезно, если бы вы могли опубликовать точный код, который вы используете. Скорее всего, это ваш код, но есть вероятность, что это может быть ошибкой в ​​драйверах Mongo PHP. Последняя версия драйверов (1.2.9) кажется шагом назад по сравнению с предыдущими версиями. Я сам обнаружил ошибку в драйвере, из-за которой php вызывал segfault при превышении времени ожидания соединения: o В разговоре с разработчиком 10gen мне выяснилось, что драйверы php являются наименее зрелыми из всех языков, но мне сказали что они только что наняли разработчика php, так что водителям скоро придётся немного полюбить.

1 голос
/ 07 января 2012

Я не слишком много знаю о вашем конкретном случае;однако, это случалось со мной несколько раз с использованием mysql и cakephp.Я никогда не использовал Монго с PHP, хотя.Попробуйте следующее:

A) Вы настроили какие-либо индексы в вашей БД?
B) Вы можете увеличить лимит памяти через php.ini, мой обычно установлен на уровне 256 МБ.
C)Возможно, ваши ассоциации вызвали создание множества объектов.Я сомневаюсь, что ваш запрос вызывает заполнение 60 Мб, а скорее некоторый рекурсивный хаос из-за ассоциаций.Попробуйте связать ассоциации перед вызовом запроса.
D) Отключите все ассоциации и медленно продвигайтесь вверх.

Я знаю, что монго должно устранить необходимость в сложных запросах.Возможно, это больше проблема языка / библиотеки?

Надеюсь, это поможет!

1 голос
/ 11 января 2012

Попробуйте команду db.<your collection>.validate() в соответствующей коллекции из оболочки.
Попробуйте db.<your collection>.reIndex() вызвать коллекцию.
Попробуйте удалить все индексы и воссоздать их в этой коллекции (даже во всех коллекциях; ничего не повредит).
Попробуйте db.repairDatabase() из оболочки.

Кроме того, из вашего PHP-кода попробуйте те же критерии, что и для find (), и посмотрите, нет ли у вас повреждения памяти.

1 голос
/ 31 декабря 2011

Зная, что Mongo ищет с помощью строгого хеширования, и что последовательность поиска для любого заданного идентификатора ограничена, абсолютно невозможно, чтобы это делал Монго.

Если вы используете MongoID, вы должны быть уверены , что идентификатор действителен. Потому что MongoID является разрешенным хешем для данной записи.

Это может быть проблемой. Или я могу быть совершенно не прав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...