Foros del Web » Programando para Internet » PHP »

Recorrer arreglos es muy lento

Estas en el tema de Recorrer arreglos es muy lento en el foro de PHP en Foros del Web. Hola Dentro de una tabla (TABLA A), hay un campo donde se pueden ingresar números, estos son separamos por comas o por guiones en el ...
  #1 (permalink)  
Antiguo 15/09/2014, 18:26
Myl
 
Fecha de Ingreso: agosto-2011
Mensajes: 61
Antigüedad: 12 años, 8 meses
Puntos: 3
Recorrer arreglos es muy lento

Hola

Dentro de una tabla (TABLA A), hay un campo donde se pueden ingresar números, estos son separamos por comas o por guiones en el caso que sean rangos (45,46,47 o 45-50). Hice un script que borra todos los registros, toma estos campos y los abre para luego insertarlos en filas separadas (TABLA B):
Ejemplo:
Rango: 45,46,47,48
Crea 4 Insert dentro de otra tabla (TABLA B), esto es para tener un mejor manejo de la información.

El script funciona perfectamente. El problema es que corre cada una hora y inserta mas de 130.000 registros, lo que a la larga colapsa el servidor.
Lo que se me ocurrió para optimizar este proceso, es pasar toda la carga a PHP y hacer un select desde la tabla con los campos del tipo (45,46,47… TABLA A) Y luego hacer otro select con los datos que tiene la tabla con los nuevos registros (TABLA B) y al momento de hacer el insert, primero ir a preguntar al en los datos de la TABLA B si existe el registro o no:

Código PHP:
$arregloTablaA //Datos desde la tabla A
$arregloTablaB // Mas de 130.000 registros

foreach($arregloTablaA  as $indice => $valor){
    
//Toda la lógica para abrir los registros que omitiré pues no aporta mucho
    
If(¡BuscarDatosEnArregloTablaB($arregloTablaB,$valor[‘dato’]){
        
//HagoInsert
    
}
}

function 
BuscarDatosEnArregloTablaB($arregloTablaB,$dato){
    
$boolExiste false;
    foreach(
$arregloTablaB as $indice => $valor){
        if(
$dato == $valor['x']){
            
$boolExiste true;
            break;
        }
    }

    if(
$boolExiste){
        return 
true;
    } else {
        return 
false;
    }

El problema es que cada vez que recorra el arregloA, recorrerá más de 130.000 veces los datos del arregloB lo que a la larga hace que el proceso sea muy lento. Si bien la carga a la base de datos baja, el proceso es lento y usa mucha memoria.

Agradecería me puedan ayudar a como optimizar este proceso.

De antemano gracias.
  #2 (permalink)  
Antiguo 16/09/2014, 04:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Recorrer arreglos es muy lento

Para arrays unidimensionales http://php.net/manual/es/function.in-array.php

Para multidimensionales

Código PHP:
Ver original
  1. function in_multiarray($elem, $array,$field)
  2. {
  3.     $top = sizeof($array) - 1;
  4.     $bottom = 0;
  5.     while($bottom <= $top)
  6.     {
  7.         if($array[$bottom][$field] == $elem)
  8.             return true;
  9.         else
  10.             if(is_array($array[$bottom][$field]))
  11.                 if(in_multiarray($elem, ($array[$bottom][$field])))
  12.                     return true;
  13.  
  14.         $bottom++;
  15.     }        
  16.     return false;
  17. }

Igual va mas rápido, pero esos 130.000 registros no los tienes en una tabla de una base de datos, si es el caso porque no usas el servidor de bases de datos para hacer esa comprobación he inserción.....

Creo que ganarias aun que tengas que crear una tabla temporal....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 16/09/2014, 07:24
Myl
 
Fecha de Ingreso: agosto-2011
Mensajes: 61
Antigüedad: 12 años, 8 meses
Puntos: 3
Respuesta: Recorrer arreglos es muy lento

Hola

Gracías por tu respuesta.

La idea es quitarle la carga a la Base de Datos (por eso mismo descarté opcion de usar INSERT IGNORE),y he optado por hacer todo el manejo de información desde el codigo.

He probado con in_array (Que basicamente es lo mismo que he hecho) y el resultado es el mismo. No se me ocurre una manera mas optima de manejar tal cantidad de información.

Saludos,
  #4 (permalink)  
Antiguo 16/09/2014, 08:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Recorrer arreglos es muy lento

Cita:
La idea es quitarle la carga a la Base de Datos (por eso mismo descarté opcion de usar INSERT IGNORE),y he optado por hacer todo el manejo de información desde el codigo.

He probado con in_array (Que basicamente es lo mismo que he hecho) y el resultado es el mismo. No se me ocurre una manera mas optima de manejar tal cantidad de información.
Quitarle a la base una tarea para la cual está específicamente optimizada, no me aprece una decisión correcta.
Precisamente los DBMS están diseñados para realizar tareas con cantidades masivas de datos, en cambio los recursos de las aplicaciones no.
Sería mucho más eficiente hacerlo en la base, pero bueno, es tu decisión.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 16/09/2014, 08:09
Myl
 
Fecha de Ingreso: agosto-2011
Mensajes: 61
Antigüedad: 12 años, 8 meses
Puntos: 3
Respuesta: Recorrer arreglos es muy lento

Hola

Desafortunadamente no es mi desición, como dije. Hacer 130.000 INSERT cada 1 hora es demasiado para el servidor que utilizo.

Gracias por tu respuesta.

Saludos,
  #6 (permalink)  
Antiguo 16/09/2014, 08:49
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Recorrer arreglos es muy lento

Cita:
Iniciado por Myl Ver Mensaje
Hola

Desafortunadamente no es mi desición, como dije. Hacer 130.000 INSERT cada 1 hora es demasiado para el servidor que utilizo.

Gracias por tu respuesta.

Saludos,
Como bien te dijeron las bases de datos estan optimizadas para ese tipo de trabajo y 130000 inserciones por hora no es nada para una base de datos.......pero de que base de datos estamos hablando????
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: arreglos, lento, registro, select, tabla
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 22:33.