2011-12-06 19 views
12

Mi memory_limit PHP es 64M (que es bastante alto para empezar)PHP y Mongo - findOne() provoca el agotamiento de memoria

Tengo un MongoCollection :: findOne() llamada en mi código PHP en el que "encontrar uno "por MongoId. Funciona en la mayoría de los casos. Sin embargo, en algunos casos, provoca que PHP supere el límite de memoria de 64M.

El registro de datos en Mongo es como máximo, 3.5MB porque Mongo no permite más de 4MB.

Cuando ejecuto, memory_get_usage() antes de llamar a findOne(), solo tiene unos 4MB. Entonces findOne() parece haber consumido los otros 60MB +. ¿Es esto una pérdida de memoria o hay un defecto de diseño en la forma en que guardo en Mongo?

conductor Mi PHP Mongo es la última 1,26

+0

¿Suministraste algo a MongoCollection :: findOne()? – ajreal

+0

sí, suministró "_id" –

+0

¿qué tipo de valor para _id? – ajreal

Respuesta

1

Sería útil si pudiera publicar el código exacto que está ejecutando. Es muy probable que sea su código, pero existe la posibilidad de que pueda ser un error con los controladores de Mongo PHP. La última versión de los controladores (1.2.9) parece ser un paso atrás de las versiones anteriores.Yo mismo encontré un error en el controlador que hace que php segfault en los tiempos de espera de conexión: o En una conversación que tuve con un desarrollador de 10gen me fue revelado que los drivers php son los menos maduros de todos los idiomas, pero me dijeron que acaban de contratar a un desarrollador de php para que los conductores puedan obtener algo de amor pronto.

1

Sabiendo que Mongo mira hacia arriba por una estricta hash, y que la secuencia de consulta para cualquier ID dado es limitada, no hay absolutamente ninguna manera esto podría ser Mongo está haciendo.

Si está utilizando un MongoID, entonces debe ser seguro que el ID sea válido. Porque un MongoID es el resuelto hash para el registro dado.

Este podría ser el problema. O podría estar completamente equivocado.

1

No sé demasiado sobre su caso específico; sin embargo, eso me ha sucedido varias veces usando mysql y cakephp. Sin embargo, nunca he usado mongo con php. Intente lo siguiente:

A) ¿Ha configurado algún índice en su base de datos?
B) Puede aumentar su límite de memoria a través de php.ini, el mío generalmente se establece en 256mb.
C) Puede ser que sus asociaciones hayan creado un grupo de objetos. Dudo que su consulta esté causando que los 60mb se llenen, sino más bien un caos recursivo debido a las asociaciones. Pruebe a desvincular las asociaciones antes de llamar a su consulta.
D) Desactive todas las asociaciones y avance lentamente.

Sé que se supone que mongo elimina la necesidad de consultas complejas. Tal vez esto es más un problema de lenguaje/biblioteca?

Espero que esto ayude!

1

Pruebe el comando db.<your collection>.validate() en la colección respectiva del shell.
Pruebe una llamada db.<your collection>.reIndex() en la colección.
Pruebe soltar todos los índices y recrearlos en esa colección (incluso todas las colecciones, no dañará nada).
Pruebe db.repairDatabase() desde el armazón.

Además, desde su código PHP, intente con los mismos criterios que un find() y vea si tiene daños en la memoria.

Cuestiones relacionadas