Foros del Web » Programando para Internet » PHP »

Actualiza miles de registros al mismo tiempo

Estas en el tema de Actualiza miles de registros al mismo tiempo en el foro de PHP en Foros del Web. Hola, hoy me eh topado con un problema donde me piden: 1.- Generar una tabla combinando datos de otras tablas eso me da por resultado ...
  #1 (permalink)  
Antiguo 30/11/2011, 20:24
 
Fecha de Ingreso: marzo-2009
Ubicación: Lima
Mensajes: 73
Antigüedad: 15 años
Puntos: 1
Información Actualiza miles de registros al mismo tiempo

Hola,

hoy me eh topado con un problema donde me piden:

1.- Generar una tabla combinando datos de otras tablas
eso me da por resultado miles de registros

hago los select de las tablas luego hago un foreach para ir guardando los datos en la nueva tabla.

eso me obliga a cambiar en el php.ini los valores de max_execution_time y memory_limit a mas de 20 minutos

como podría lidiar con eso.

recurro a su experiencia. ya que carezco de experiencia del trabajo en grandes proyectos

Gracias de antemano.
  #2 (permalink)  
Antiguo 30/11/2011, 20:28
 
Fecha de Ingreso: noviembre-2011
Mensajes: 27
Antigüedad: 12 años, 4 meses
Puntos: 3
Respuesta: Actualiza miles de registros al mismo tiempo

Buenas,
Si podrias ponernos el codigo, para ver como lo tenes, asi vamos viendo en que te podemos ayudar.
  #3 (permalink)  
Antiguo 30/11/2011, 20:30
 
Fecha de Ingreso: marzo-2009
Ubicación: Lima
Mensajes: 73
Antigüedad: 15 años
Puntos: 1
Respuesta: Actualiza miles de registros al mismo tiempo

Cita:
Iniciado por Panga Ver Mensaje
Buenas,
Si podrias ponernos el codigo, para ver como lo tenes, asi vamos viendo en que te podemos ayudar.
Estoy con symfony

Código PHP:
Ver original
  1. public function executeGenerate($id=null){
  2.        
  3.         //lista productos
  4.         $P = Doctrine_Query::create()->select('p.id, p.referencia')->from('Productos p');
  5.         $productos = $P->fetchArray();
  6.        
  7.         //lista tallas
  8.         $T = Doctrine_Query::create()->select('t.id, t.nombre')->from('Tallas t');
  9.         $tallas = $T->fetchArray();
  10.        
  11.         //lista colores
  12.         $C = Doctrine_Query::create()->select('c.id, c.referencia')->from('Colores c');
  13.         $colores = $C->fetchArray();
  14.        
  15.         $listJoin=array();
  16.        
  17.         ini_set("memory_limit","200M");
  18.         set_time_limit(1200);
  19.        
  20.         $i=1;
  21.         $noChar = array(" ", "/", "-");
  22.         foreach($productos as $producto){
  23.             foreach($colores as $color){
  24.                 foreach($tallas as $talla){
  25.                     $combina = new Combinaciones();
  26.                     //$listJoin[] = $producto['referencia'].$color['referencia'].$talla['nombre'];
  27.                     $combina->fromArray(array(
  28.                       'activo'          => true,
  29.                       'nombre'          => str_replace($noChar, "", $producto['referencia'].$color['referencia'].$talla['nombre']),
  30.                       'productos_id'    => $producto['id'],
  31.                       'tallas_id'       => $talla['id'],
  32.                       'colores_id'      => $color['id'],
  33.                     ));
  34.                     $combina->save();
  35.                 }
  36.             }
  37.         }
  38.         //$this->listJoin = $listJoin;
  39.         $this->redirect('combinaciones/index');
  40. }

Este es mi actual código pero demora mucho tiempo en ejecutarse.

gracias por responder

Última edición por yoelkj; 30/11/2011 a las 20:33 Razón: colocar Highlight
  #4 (permalink)  
Antiguo 01/12/2011, 00:00
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Actualiza miles de registros al mismo tiempo

se ejecuta o no? Me refiero si te funciona o no lo hace y cual es el error.

Recientemente hice un programa que hacia una consulta en un website, recogia los datos con curl y los almacenaba en la database. Puse los limits a 144 horas, ( calculé que el script tardaría poco menos que eso en acabar y así fue.)

Si es verdad que tardó casí una semana pero funcionó y es lo que importa.

En mi caso son casi 20 millones de registros, en el tuyo solo miles y además no estás enviando una consulta a una página web dinámica, esperando que ésta devuelva una respuesta y extrayendo los datos del código fuente. Por lo que en tu caso imagino que tardará minutos en finalizar.

Si te gustaría trabajar más rápido para futuros proyectos, utiliza bases de datos que trabajen en binario como SQLITE. muy rápido, nada legible y más difícil de administrar que MySQL o postgresql.

Saludos.

::::::::::::::EDITO:::::::::::::::

Tal vez haya algunas recomendaciones que te puedo dar.

* Crear un archivo de texto donde tu programa escriba logs (que indiquen el estado de los querys ejecutados exitosamente y los que no). Te ayudará saber que datos no fueron insertados en la DB.

* Eso de utilizar la memoria del servidor para guardar todos los miles de registros de una tabla y convinarlos con otros miles de registros de otra para despues recorrer estos arreglos y obtener los valores e insertarlos en otra tabla, no es lo más conveniente.

Lo que puedes hacer es obtener 1 a 1 , convinarlo e insertarlo, despues liberar la memoria, y volver a hacerlo con el siguiente valor. etc... sucesivamente.

Una función recursiva bien planteada te ahorrará tiempo y lineas de código.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.

Última edición por iovan; 01/12/2011 a las 00:12
  #5 (permalink)  
Antiguo 01/12/2011, 11:19
 
Fecha de Ingreso: marzo-2009
Ubicación: Lima
Mensajes: 73
Antigüedad: 15 años
Puntos: 1
Información Respuesta: Actualiza miles de registros al mismo tiempo

Cita:
Iniciado por iovan Ver Mensaje
se ejecuta o no? Me refiero si te funciona o no lo hace y cual es el error.

Recientemente hice un programa que hacia una consulta en un website, recogia los datos con curl y los almacenaba en la database. Puse los limits a 144 horas, ( calculé que el script tardaría poco menos que eso en acabar y así fue.)

Si es verdad que tardó casí una semana pero funcionó y es lo que importa.

En mi caso son casi 20 millones de registros, en el tuyo solo miles y además no estás enviando una consulta a una página web dinámica, esperando que ésta devuelva una respuesta y extrayendo los datos del código fuente. Por lo que en tu caso imagino que tardará minutos en finalizar.

Si te gustaría trabajar más rápido para futuros proyectos, utiliza bases de datos que trabajen en binario como SQLITE. muy rápido, nada legible y más difícil de administrar que MySQL o postgresql.

Saludos.

::::::::::::::EDITO:::::::::::::::

Tal vez haya algunas recomendaciones que te puedo dar.

* Crear un archivo de texto donde tu programa escriba logs (que indiquen el estado de los querys ejecutados exitosamente y los que no). Te ayudará saber que datos no fueron insertados en la DB.

* Eso de utilizar la memoria del servidor para guardar todos los miles de registros de una tabla y convinarlos con otros miles de registros de otra para despues recorrer estos arreglos y obtener los valores e insertarlos en otra tabla, no es lo más conveniente.

Lo que puedes hacer es obtener 1 a 1 , convinarlo e insertarlo, despues liberar la memoria, y volver a hacerlo con el siguiente valor. etc... sucesivamente.

Una función recursiva bien planteada te ahorrará tiempo y lineas de código.
Hola gracias por responder.

me aclaras el panorama.

En realidad funciona el código, el problema es el tiempo de ejecución llega a durar un promedio de 1 hora por exagerar pero funciona.

me gusta mas la última solución la de insertar y liberar la memoria pero no se como hacerlo.

el Script termina generando un promedio de 50 000 registros

Agradezco mucho tu respuesta

Etiquetas: actuliza, registros
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 13:45.