Me gustó la idea de "tirar" la lista estatica dentro de la clase..de todos
modos el código tuyo mejorado no toma en cuenta muchas cosas a la hora de
agregar las md5 y rutas del archivo en el Hash...q por ejemplo no se fije si
esta el md5 cuando el hashmap esta vacio y otras cosas...pero eso no es lo
importante aca..agradezco q te tomaste la molestia de modificarlo y ver como
mejorarlo, ya adapte el mio con algunas ideas tuyas..de todos modos la
eficiencia sigue siendo la misma y tendría que ponerme a probar...pueden ser
2 cosas

1) Ineficiencia a la hora de recorrer los directorios de forma recursiva
2) Ineficiencia al calcular el MD5 de los archivos, ya que requiere leerlos
(ME LA JUEGO POR ESTA)

Entonces me planteo...como calcular el MD5 de un archivo sin tener que
acudir al supongo yo ineficiente método read de la clase File que incluye el
Core de Ruby ?

Cuando se lee un archivo de gran tamaño se muere el procesador...

Hay alguna alternativa a todo esto ? DEBERIA haber...puedo usar otro
checksum pero no creo que sea ese el drama.



On 9/1/07, Martin Sagastume <[EMAIL PROTECTED]> wrote:
>
> Je si vi que la estaba creando con cada llamada...horror!
> Lo de la linea de comandos lo tuve en cuenta pero primero quiero
> solucionar el tema de la eficiancia :P  ...estuve mirando pero con el update
> de MD5 tambien es necesario leer el archivo, osea por lo que vi no se puede
> obtener el md5 si primero no haces el File.read  ...que es lo que mata el
> procesador y sobre todo cuando el archivo es medianamente grande. 1.5GB =
> 4 minutos aprox  ...ya saque lo de la lista pero igual sigue re "lento" el
> asunto =S  voy a ver si comparo con tu código
>
> On 9/1/07, Emmanuel Oga <[EMAIL PROTECTED]> wrote:
>
> > Martin: Quize revisar tu programa y termine modificandolo un poco... te
> > mando lo que hice para que compares. Igual, no creo que levante mucho la
> > performance solo por estos cambios.
> >
> > require 'find'
> > require 'digest/md5'
> >
> > class Dupes
> >
> >     # Creamos el array solo una vez, no cada vez que llamas al metodo
> > esExtensionPermitida?
> >     # CONSTANTE
> >     LISTA_EXTENSIONES= %w{ .iso .img .mp3 .wav .wma .ogg .rb
> >                            .jpg .gif .png .jpeg .bmp .avi
> >                            .mpg .wmv .cue .bin .rar .tar
> >                            .jar .zip .7z  .gz .bz2 .cpkg
> >                            .deb .rpm .pdf .spx .xcf .odt
> >                            .rtf .odg .odp .ods .exe .msi
> >                            .doc .pps .ppt .xls .nrg .tmp
> >                            .dat .bak .sfv .m3u }
> >
> >   def initialize
> >     # Guardamos nombre_archivo => hash
> >     @file_hashes= { }
> >   end
> >
> >   def buscarDupes(rutas)
> >     for ruta in rutas
> >
> >         Find.find(ruta) do |file|
> >
> >             if (File.ftype(file) != "directory") &&
> >                (File.ftype(file) != "link") &&
> >                LISTA_EXTENSIONES.include?( File.extname(file))
> >
> >                 key= file.intern # Convierte String a Symbol => Cadena
> > inmutable, digamos...
> >
> >                 digest = Digest::MD5.hexdigest(File.read(file))
> >
> >                 if @file_hashes.has_key? key
> >                     puts "El archivo ya estaba presente"
> >                 else
> >                     puts "Se coloca el archivo #{key} con hash:
> > #{digest}"
> >                     @file_hashes[key]= digest
> >                 end
> >             end
> >         end
> >
> >     end
> >   end
> > end
> >
> > # "IDIOM", si en vez de requerir el archivo lo llamas directamente de
> > linea de comando, ejecuta lo que esta dentro del if
> > if __FILE__ == $0 then
> >   Dupes.new.buscarDupes(ARGV)
> > end
> >
> > *Martin Sagastume < [EMAIL PROTECTED]>* escribió:
> >
> > Hola Luis, primero que nada agradezco tu tiempo por probarlo y por venir
> > a responderme :-D  ...como dije anteriormente soy muy nuevo....voy a revisar
> > eso porq la verdad es que si veo la ineficiencia de los algoritmos...me
> > gustaría saber como usar el ruby-prof para poder testear todo eso yo mismo
> > sin tener que joder por aca para q lo prueben.
> >
> > Voy a leer la alternativa a FileRead supuse que eso era lo q me estaba
> > matando :P  ...pero no se como "leer" de una manera menos costosa los
> > archivos, por lo cual voy a ver chuncks como me dijiste y el update al MD5.
> >
> > Cambiaría el método entonces por una lista global como  me aconsejas.
> >
> > Pruebo y veo que onda...
> >
> > Nuevamente.. mil gracias!!
> >
> > On 9/1/07, Luis Lavena <[EMAIL PROTECTED]> wrote:
> > >
> > > On 9/1/07, Martin Sagastume <[EMAIL PROTECTED]> wrote:
> > > > Masomenos ya esta terminado...solo un pequeño problema jajaj demora
> > > mas de
> > > > 15 minutos en scannear mi carpeta personal /home/martin  y encima se
> > > re
> > > > funde el micro..no puedo hacer mas nada!!!  Siempre me canso y mato
> > > el
> > > > proceso ruby antes de dejarlo terminar...mi notebook es un celeron M
> > > de
> > > > 1.43ghz con 1GB DDR ...estaría bueno que alguien lo pruebe, es
> > > demasiado
> > > > ineficiente esto jeje
> > > >
> > >
> > > Martin, aunque en mi maquina (Windows) no se produce esto (por alguna
> > > razon el GC es mas eficiente) te hago unas sugerencias.
> > >
> > > Ya que podes encontrarte con archivos gigantezcos, te recomiendo no
> > > hagas File.read(), sino busques una alternativa streamlined.
> > > (leer chuncks y usar #update de la clase MD5).
> > >
> > > Segun ruby-prof:
> > >
> > >   0.37      0.11     0.11     0.00     0.00    65730  
> > > <Class::File>#extname
> > >
> > >   0.05      0.02     0.02     0.00     0.00    74947  String#==
> > >
> > > 65730 llamadas a extname! eso si que es expensive (y otras tantas a
> > > #== de String).
> > >
> > > En lugar de construir la lista de extensiones validas, podrias:
> > >
> > > class Dupes
> > >   @@extensiones = %w{ .iso .img .mp3 .wav .wma .ogg .jpg .gif .png
> > > .jpeg .bmp .avi .mpg .wmv .cue .bin .rar .tar .jar .zip .7z .gz .bz2
> > > .cpkg .deb .rpm .pdf .spx .xcf .odt .rtf .odg .odp .ods .exe .msi .doc
> > >
> > > .pps .ppt .xls .nrg .tmp .dat .bak .sfv .m3u }
> > >
> > > y luego reemplazar todo el metodo esExtensionPermitida? por esto:
> > >
> > >   def esExtensionPermitida?(dir)
> > >     @@extensiones.include?(File.extname(dir))
> > >   end
> > >
> > > Voy a correr unos benchs cuando tenga un tiempito y tiro otras
> > > sugerencias.
> > >
> > > --
> > > Luis Lavena
> > > Multimedia systems
> > > -
> > > Leaders are made, they are not born. They are made by hard effort,
> > > which is the price which all of us must pay to achieve any goal that
> > > is worthwhile.
> > > Vince Lombardi
> > > _______________________________________________
> > > Ruby mailing list
> > > [email protected]
> > > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > >
> > >
> >
> >
> >
> > --
> > Martín Sagastume
> > 094-575846
> > Montevideo - Uruguay
> > http://musicapastillera.blogspot.com_______________________________________________
> > Ruby mailing list
> > [email protected]
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> >
> >
> >
> > ------------------------------
> >
> > ¡Sé un mejor besador!
> > Compartí todo lo que sabés sobre besos en
> > http://ar.yahoo.com/promos/mejorbesador.html
> >
> >
> > _______________________________________________
> > Ruby mailing list
> > [email protected]
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> >
> >
>
>
> --
> Martín Sagastume
> 094-575846
> Montevideo - Uruguay
> http://musicapastillera.blogspot.com
>



-- 
Martín Sagastume
094-575846
Montevideo - Uruguay
http://musicapastillera.blogspot.com
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a