[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT]Re: Programa extremadamente lento



On Tue, Feb 03, 2009 at 06:32:34PM +0100, Gorka wrote:
> > > 2009/2/3 Gorka <gorkalinux@yahoo.es>:
> > > > Hola.
> > > >
> > > > Tengo un script de perl con este bucle:
> > > >
> > > >  for (my $j=0;$j<=$#fichero1;$j++)
> > > >  {
> > > >    if (@fichero1[$j] eq $valor1)
> > > >    {
> > > >      $token = 1;
> > > >    }
> > > >  }
> > > >
> > > > El problema es que fichero1 tiene 32 millones de registros y que,
> > > además,
> > > > tengo que hacer este bucle millones de veces, por lo que he
> > calculado
> > > que me
> > > > tardaría AÑOS en acabar.
 
> > ¿Qué pretendes hacer en ese bucle? ¿Simplemente ver si en $valor está
> > en @fichero? En tal caso, mejor usa algo como grep (la función en
> > perl, no el binario en shell). O, si el orden no es muy importante,
> > guarda todo @fichero en un hash, en lugar de en un arreglo.
> > 
> > Por otra parte, ¿en última instancia qué resultado estas esperando? A
> > menos que estés haciendo cómputo científico, es probable que tu
> > problema no *necesite* hacer tantos bucles. Quizá te convenga
> > detenerte a pensar un poco y replantear tu algoritmo desde un nivel
> > más alto, antes de hacer optimización de bajo nivel en los bucles.
> 
> Este bucle es un resumen, en realidad es parte de un script un poco más
> complejo donde comparo dos ficheros de linux para generar un tercero con
> sólo las líneas del segundo que no están en el primero. (Esto es un poco
> resumido, porque en realidad necesito la pareja de líneas del segundo, como
> podéis ver en el ejemplo anterior). Por tanto en este punto del programa,
> sólo quiero ver si el $valor1 está en @fichero.
> 
> ¿Cómo aplico grep; contra el array ---grep $valor1 @fichero1--- ó cómo se
> hace desde perl contra el fichero original?

No me acuerdo con detalle. Pero:

 $ aptitude install perl-doc
 $ perldoc -f grep

debería ayudar.

> Sí que estoy haciendo cómputo científico, pero no entiendo a lo que te
> refieres con lo de replantear mi algoritmo desde un nivel más alto.

A que en lugar de optimizar el bucle, replantees si necesitas un
bucle. Por ejemplo, dada tu descripción del problema, probablemente
algo como lo siguiente sea mejor:

 - Lee archivo1, guarda sus lineas como llaves de un hash.
 - Para cada linea de archivo2:
  - Si está en el hash, saltala
  - en caso contrario, procesala

Replanteando el problema así, en vez de dar miles de vueltas sobre
cada una de las miles de lineas del archivo, das una vuelta sobre cada
archivo, lo cual hace que la velocidad con la que procesas cada una
sea mucho menos importante.

La referencia a hablar de cómputo científico es que ese es uno de los
pocos campos donde los problemas realmente requieren hacer miles de
bucles sobre miles de datos.


Reply to: