Foros del Web » Programando para Internet » PHP »

Ejecutar pedazos de codigo en lote

Estas en el tema de Ejecutar pedazos de codigo en lote en el foro de PHP en Foros del Web. Hola, tengo un problema o un problemon!! No se ni como decirle, el tema es que debo leer un fichero que contiene 16 000 IDs ...
  #1 (permalink)  
Antiguo 25/05/2012, 23:23
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Ejecutar pedazos de codigo en lote

Hola, tengo un problema o un problemon!! No se ni como decirle, el tema es que debo leer un fichero que contiene 16 000 IDs y con cada uno de esos IDs debo realizar una consulta de INSERT a una BD. Si dejo el script en ejecucion quien sabe que tiempo necesite porque depende de muchos factores y pudiera lograrlo aumentando los valores en el php.ini pero no es lo que quiero. Alguien sabe como ejecutar estos INSERT de 50 en 50 o de 25 en 25? Alguna sugerencia de solucion?

Saludos y gracias por adelantado
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #2 (permalink)  
Antiguo 25/05/2012, 23:34
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Ejecutar pedazos de codigo en lote

Tu problema no son los insert, si fuera eso seria sencillo resolver tu problema, el verdadero problema y el que consume mas recursos y tiempo es precisamente el archivo que contiene los ID's, el problema es leer el archivo, aunque hagas bloques de 20 items o de 10 será lo mismo, ya que para pasar de un bloque a otro será necesario "leer" los items anteriores hasta llegar al item correspondiente, sería bueno saber el peso del archivo y el tipo de contenido, a parte, ver tu código y ver que tan optimizado lo tienes...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #3 (permalink)  
Antiguo 25/05/2012, 23:41
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Ejecutar pedazos de codigo en lote

El fichero pesa alrededor de 4.2MB y el codigo que uso para leerlo es este:
Código PHP:
$archivo file("6536644843.txt");
$asin $isbn = array();
foreach (
$archivo as $n => $linea) {
    echo 
$n" -> "trim(substr($linea, -1713)), "<br>";
    
trim(substr($linea, -173)) != "B" $isbn[] = trim(substr($linea, -1713)) : $asin[] = trim(substr($linea, -1713));
}
echo 
"<pre>";
array_shift($isbn);
print_r($isbn);
echo 
"<hr>";
echo 
count($isbn);
echo 
"<hr>";
print_r($asin);
echo 
"<hr>";
echo 
count($asin); 
Claro que los echo y los print_r son solo de muestra para ver los resultados devueltos y verificar que sean correctos. La estructura general del fichero es como muestro a continuacion:
Código:
El Antiguo Madrid: Paseos Histórico-Anecdóticos por las Calles y Casas de Est...\t\t0426INZZERQ\t0553\t50\t1\t2011-04-26 10:55:57 PDT\t\ty\t1\t\t\2\t\t\t\t\t\t\t2\tInternational\t\t8423706923\t\t\t0
El \t representa una tabulación. De ahi me interesaria coger lo siguiente: 50, el 1 que esta a continuacion y el numero 8423706923 pero no tengo idea de como hacerlo. Help?

__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #4 (permalink)  
Antiguo 26/05/2012, 00:29
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Ejecutar pedazos de codigo en lote

mmmm probablemente sea mas "optimo" guardar los items en un arreglo y luego trabajar con ellos, te dejo un ejemplo...

Código PHP:
Ver original
  1. $pag = isset($_GET['pag']) ? $_GET['pag'] : 1;
  2. $numItem = 0;
  3. $numItemStart = ($pag - 1) * 20; //20 es el numero de items o lineas con las que trabajaremos...
  4. $numItemsEnds = $numItemsStart + 20;
  5. $items = array();
  6. $archivo = fopen('archivo.txt','r');
  7. while (!feof($archivo)) {
  8.      $linea = fgets($archivo);
  9.      if ($numItem > $numItemStart && $numItem <= $numItemEnds) {
  10.           $items[] = $linea;
  11.      }else if ($numItem > $numItemsEnds) {
  12.           break;
  13.      }
  14. }
  15. fclose($archivo);
  16.  
  17. //ahora trabajamos con los items...
  18. foreach($items as $item) {
  19.      echo $n, " -> ", trim(substr($linea, -17, 13)), "<br>";
  20.     trim(substr($linea, -17, 3)) != "B" ? $isbn[] = trim(substr($linea, -17, 13)) : $asin[] = trim(substr($linea, -17, 13));
  21. }

aunque sinceramente no se que tanta diferencia va a ver, el problema te repito es el recorrer el archivo original hasta llegar al item (linea) correspondiente...

PD: me quede intrigado y he hecho pruebas, y por lo que veo trabaja muy bien, generé un archivo con 60,000 lineas y en bloques de 20 items (lineas) trabaja muy bien, obtener items dentro del rango 15000 al 15020 solo tarda 0.0314 microsegundos...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 26/05/2012 a las 00:37

Etiquetas: lote
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 17:54.