Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

POO, ORM con doctrine y problemas en la cantidad de datos recuperados

Estas en el tema de POO, ORM con doctrine y problemas en la cantidad de datos recuperados en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 18/09/2011, 16:04
 
Fecha de Ingreso: septiembre-2011
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
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:
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 />
Asumo que es porque me excedo de la memoria permitida por el servidor php del hosting.
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.
  #2 (permalink)  
Antiguo 19/09/2011, 10:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
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 original
  1. $sQuery = "SELECT * FROM foo";
  2. $aObjs = array();
  3. while ($row = mysql_fetch_row(mysql_query($sQuery)) {
  4.       $aObjs[] = new MyObj($row);
  5. }
  6.  
  7. // y despues filtras

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.
  #3 (permalink)  
Antiguo 19/09/2011, 10:35
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
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:
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)...
@Maxcool, podrias utilizar HYDRATE_ON_DEMAND.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 19/09/2011, 13:05
 
Fecha de Ingreso: septiembre-2011
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados

GatorV... estoy utilizando DQL...

Código:
$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);
			}
esa es una parte del código de la consulta...
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!!!
  #5 (permalink)  
Antiguo 19/09/2011, 13:26
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 17 años, 11 meses
Puntos: 14
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 original
  1. $array_de_objetos[$indice] = new MiObjeto ($param1, $param2, ...) ;

Quizás si sólo creas un objeto a la vez...
Código PHP:
Ver original
  1. $solo_un_objeto_a_la_vez = new MiObjeto ($param1, $param2, ...) ;

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
  #6 (permalink)  
Antiguo 19/09/2011, 14:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: POO, ORM con doctrine y problemas en la cantidad de datos recuperados

Exacto en este caso creo que deberías de paginar los resultados, ya que si no pones filtros y te trae toda la BDD, es donde te estas llevando toda la memoria.

Saludos.
  #7 (permalink)  
Antiguo 31/01/2012, 07:53
 
Fecha de Ingreso: septiembre-2011
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
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...

Etiquetas: cantidad, doctrine, orm, php, poo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:11.