Ver Mensaje Individual
  #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.