Подтвердить что ты не робот

PHP и Mongo - findOne() приводит к исчерпанию памяти

Мой PHP memory_limit - это 64M (что довольно важно для начала)

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Это может быть проблема. Или, может быть, я ошибаюсь.

Ответ 3

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

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

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

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

Ответ 4

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

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