| |||
| POO, ORM con doctrine y problemas en la cantidad de datos recuperados Buenas... resulta que tengo un probema con un filtro de busquedas que estoy haciendo... utilizo como ORM doctrine 1.2 junto con una base de datos Mysql... La idea esrealizar un filtro de busquedas con etiquetas de donde estoy parado (en la búsqueda) similar al de mercadolibre. Para hacer mas sencilla la tarea decidí utilizar objetos, si bien el resultado del desarrollo estaría funcionando sufrió un percance al probarlo con la base de datos actual.. ( la base de datos de prueba tenía suficientes datos pero no tantos como la de producción). El problema surge que a la hora de que me liste todos los resultados de la base de datos (es decir sin colocar ningun dato al filtro) "explota" todo por decirlo de alguna manera. Básicamente me sale el siguiente error:
Código:
Asumo que es porque me excedo de la memoria permitida por el servidor php del hosting.Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 80 bytes) in /www/autosdelnea.com.ar/htdocs/ORM2/Doctrine-1.2.4/Doctrine/Record.php on line 240<br /><br /> La forma de trabajar este filtro es recuperar los datos que se aplican en el filtro mediante una consulta dql, y tenerlos en un arreglo de objetos (o lo que me devuelva la consulta del doctrine)... Luego realizo un recorrido por todos estos objetos para empezar a contar y listar las opciones extras que no fueron seleccionadas en el filtro... (para mejor entendimiento sugiero visitar mercadolibre y ver la barra de opciones encima de los resultados de busqueda..) Finalmente se listan los resultados.... Ahora... Si aplica varios filtros anda de 10... pero surge el error mostrado anteriormente cuando dejo sin aplicar ningún filtro y debe listar todos los filtros posibles con los resultados (supongo que tiene todos los objetos en memoria)... Se que hay otras formas de resolver este problema.. como por ejemplo evitar que se convierta a objetos todaaaa la base de datos cuando no se aplican filtros... Pero quería consultar con los expertos cual consideran es la mejor manera de encarar este dilema desde la perspectiva de rendimiento y flexibilidad que ofrece los objetos. |
| ||||
| Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados Desconozco lo que estas haciendo, pero el bajar toda la BDD a objetos es una pésima idea, la carga de memoria y la lentitud que va a tener tu sistema es abismal. Si estas usando Doctrine, por que no usarlo como debe de hacer, para eso tienes el DQL, y dejar que sea Doctrine que hidrate tus objetos como los necesitas, y los filtres como los necesitas. Creo la forma que lo implementaste le quitaste todo el beneficio de Doctrine, ya que básicamente por lo que dices estas haciendo esto:
Código PHP:
Ver originalCopiar Debes de filtrar usando DQL, y usar las mismas funciones de DQL para obtener el total, paginar, etc. Tener todos los objetos en memoria siempre te va a ocasionar ese problema, por lo que para reparar tu problema, debes de replantear todo tu sistema, no solo aumentar el límite de memoría. Saludos. |
| ||||
| Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados Creo que esta utilizando DQL, o al menos eso me parece, Cita: @Maxcool, podrias utilizar HYDRATE_ON_DEMAND.La forma de trabajar este filtro es recuperar los datos que se aplican en el filtro mediante una consulta dql, y tenerlos en un arreglo de objetos (o lo que me devuelva la consulta del doctrine)... Saludos.
__________________ "If you can't be a good example, then you'll just have to serve as a horrible warning." C. Aird |
| |||
| Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados GatorV... estoy utilizando DQL...
Código:
esa es una parte del código de la consulta...$q = Doctrine_Query::create()
->from('aviso u')
->leftJoin('u.Marca c')
->leftJoin('u.Modelo d')
->leftJoin('u.TipoVehiculo f')
->leftJoin('u.Combustible p')
->Where('f.id_categoria = 1');
//filtrar por condicion del vehiculo
if ($this->id_condicion!="")
{
$q->andWhere('u.condicion=?', $this->condicion);
}
justamente como decís vos consume mucha memoria el traer todos los datos de la tabla en objetos... (obviamente solo recupera todos cuando no hay datos en los filtros).... por eso la consulta de cual es el mejor modo de encarar el problema... masterpuppet voy a investigar eso de hydate_on_demand.... agradecería me ofrezcan alternativas. Saludos!!! |
| ||||
| Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados Hola. No he usado doctrine pero no sé si el problema es que, si tienes 10.000 registros (por ejemplo) los creas todos de forma que coexistan todos a la vez:
Código PHP:
Ver originalCopiar Quizás si sólo creas un objeto a la vez...
Código PHP:
Ver originalCopiar Es una idea. No estoy seguro de que allí radique el problema. Por otra parte. ¿El listado sin filtrar está también sin paginar? P. D: He visitado MercadoLibre pero no tengo del todo claro lo que quieres decir
__________________ No hay cuerda desafinada sino músico progresivo |
| |||
| Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados Bueno, finalmente lo que hice fue lo que me recomendaron... recuperar a objetos solamente los elementos que listo, es decir por cada pagina muestro 15 avisos, por lo cual voy recuperando de a 15, y en base a la pagina que vaya me devuelve los 15 correspondientes... |