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

RE: [OT]Re: Programa extremadamente lento




> -----Mensaje original-----
> De: Gorka [mailto:gorkalinux@yahoo.es]
> Enviado el: martes, 03 de febrero de 2009 18:09
> Para: 'Debian Usuarios'
> Asunto: RE: [OT]Re: Programa extremadamente lento
> 
> 
> 
> > -----Mensaje original-----
> > De: Victor H De la Luz [mailto:itztli@gmail.com]
> > Enviado el: martes, 03 de febrero de 2009 17:52
> > Para: Debian Usuarios
> > Asunto: [OT]Re: Programa extremadamente lento
> >
> > 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.
> > > ¿Alguien sabe alguna manera de optimizarlo? ¿O hay algún otro
> > lenguaje de
> > > programación bajo linux donde pueda hacer esto muchísimo más
> rápido?
> > > Gracias.
> > >
> > >
> >
> > Mta, es de los clasicos problemas que se ven faciles pero en la
> > realidad ya no tanto. Creo que depende de lo que estas tratando de
> > hacer.
> >
> > ¿Que estas buscando? ¿Tu lista de datos esta ordenada? ¿Que tipo de
> > datos es el que buscas? ¿Que codificación tiene tu archivo?
> >
> > pdt: Creo que es un [OT]
> >
> > --
> > ItZtLi
> 
> Hola, Víctor.
> 
> La lista está ordenada. Los datos del fichero (un fichero que crea
> automáticamente un programa en linux) inicialmente eran ...
> 
> >462_18_279_F3,1_-654315.2
> T0130330212003123010013130
> >462_32_347_F3,1_4720359.2
> T3013112021230101112012000
> >462_35_39_F3,1_-1719430.0
> T0000221230220202223010131
> >462_36_354_F3,1_-3810561.2
> T2332000221032111021000320
> >593_1644_272_F3,1_-1322672.0
> T0131030203231031022021210
> 
> .... pero yo los he volcado a un vector @fichero1 quedándome sólo la
> parte
> que me interesa comparar con $valor1, que es ...
> 
> 462_18_279
> 462_32_347
> 462_35_39
> 462_36_354
> 593_1644_272
> 
> .... que es lo que, como te digo, contienen el vector @fichero1.
> 
> Como la lista está ordenada, intenté hacer lo siguiente, ...
> 
>   for (my $j=0;($j<=$#fichero1)and($valor1 ge @fichero1[$j]);$j++)
>   {
>     if (@fichero1[$j] eq $valor1)
>     {
>       $token = 1;
>     }
>   }
> 
> .... pero por algún motivo, que aún no comprendo, me deja algunos
> valores
> fuera.
> 
> ¿Se te ocurre cómo ganar velocidad con este script?
> Un saludo.
> 
> 
> 
> 
> --
> To UNSUBSCRIBE, email to debian-user-spanish-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact

> ¿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?

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.





Reply to: