Probe a ver si era el Find lo que hacia las cosas lentas pero estos fueron
los numeros cuando ejecute el programa con el mismo directorio de parametro
pero sin pasarle MD5, simplemente recorrerlo.

Esto es lo que se demora en recorrer el directorio y guardar en el hash
(puse la variable md5 como contador) asi que esta guardando para probar

---key---   -----value-----
1              /home/martin/Musica/....
2              /home/martin/Musica/....
3              /home/martin/Musica/....

Solo para probar y resulto demorar:

real    0m0.055s
user    0m0.008s
sys     0m0.000s

Conclusion esto es lo que "enlentece" todo:

             digest = Digest::MD5.new
             File.open(dir, 'rb') { |f|
               while (chunk = f.read(4096)) do
                 digest << chunk
               end
             }
             md5 = digest.hexdigest

Implementando con la clase IO da estos resultados:

real    1m38.400s
user    0m24.594s
sys     0m3.464s


mmmmmmm 6 segundos menos   pero igual es una bestialidad, donde ponga el
directorio raiz demoraria aproximadamente 1 hora y media o mas, es obvio que
esto depende de cada uno (hardware, s/o, cant de archivos en disco, tamaño
de archivos otros factores......)



On 9/1/07, Martin Sagastume <[EMAIL PROTECTED]> wrote:
>
> Le medi el tiempo en que demoraba en scannear un directorio(con 6
> subdirectorios) con 1.3GB de archivos en total todos .ogg y este fue el
> resultado:
>
> [EMAIL PROTECTED]:~/Desktop/aptana/workspace/Twister$ time ruby
> program.rb
> Scanning...please be patient :-)Finish
>
> real    1m44.585s
> user    0m11.017s
> sys     0m1.696s
>
>
> casi 2 minutos =S ...y estoy haciendo el stream de a 4k ...  lo que me
> queda pendiente sería:
>
> 1) Utilizar el IO del s/o como me dijeron en otro post
> 2) Probar sacar los metodos y hacer todo en una clase desprolijo para
> ahorrar llamadas..etc
> 3) Cambiar el Find por Dir
>
> Alguna idea mas para la lista ? :)
>
> P.D: No entiendo porq si el puts "Scanning...please be patient :-)"  esta
> al inicio del metodo buscarDupes  lo muestra en la pantalla cuando se
> termina de correr el programa y no al principio =S
>
> On 9/1/07, Diego Algorta Casamayou <[EMAIL PROTECTED]> wrote:
> >
> > Puede ser. Miren en este ejemplo:
> >
> > http://google.com/codesearch?hl=en&q=+lang:ruby+MD5+stream+show:xmdl5JiccWE:0LaGkagTowc:E5DyjHmSI9Y&sa=N&cd=4&ct=rc&cs_p=http://files.rubyforge.vm.bytemark.co.uk/net-amazon-s3/net-amazon-s3-0.1.0.tar.gz&cs_f=net-amazon-s3-0.1.0/lib/net/amazon/s3.rb#a0
> >
> >
> > busquen donde dice:
> > while buffer = content.read(65536) do
> >   md5 << buffer
> > end
> >
> > Este otro también puede ser interesante:
> >
> > http://google.com/codesearch?hl=en&q=+lang:ruby+MD5+%3C%3C+show:_2SBRRlD3ZQ:oCRw-COYZDE:DTJVBX9Pj78&sa=N&cd=4&ct=rc&cs_p=http://rubyforge.org/frs/download.php/6087/ruby_ex-0.2.0.tar.gz&cs_f=ruby_ex-0.2.0/lib/md5sum.rb#a0
> >
> >
> > Diego
> >
> > El 1/09/07, Gabriel Arellano <[EMAIL PROTECTED]> escribió:
> > > Diego:
> > >
> > > Sería algo como esto, no?
> > >
> > >
> > >   digest = Digest::MD5.new()
> > >   archivote = File.open("/home/pepe/archivote", 'r')
> > >   archivote.each_line do |linea|
> > >     digest << linea
> > >   end
> > >
> > > O estoy muuuuuy errado?
> > >
> > >
> > > --
> > >
> > > Gabriel Arellano.
> > > Linux Registered User #188284
> > > Grupo de Estudios de Software Libre
> > > U.T.N. - F.R. C. del Uruguay
> > >
> > > ----BEGIN GEEK CODE BLOCK----
> > > Version: 3.1
> > > GCS/ED d-- s: s- a- C+++ UL++++$ P+>+++ L+++$>++++ E- W+++ w--- PS++
> > PE
> > > Y++ PGP++ t+++ 5- X++++ R++ tv+++ b+++ DI+++ D++++ G+ e++>++++ h+ r*
> > y--
> > > -----END GEEK CODE BLOCK-----
> > >
> > >
> > > On 9/1/07, Diego Algorta Casamayou <[EMAIL PROTECTED]> wrote:
> > > > Martín, la alternativa, como ya te dijo Luis, es NO leer TODO el
> > > > archivo en memoria, sino leerlo haciendo streaming (por partes, luis
> > > > lo llamó chunks). Seguirás leyendo todo el archivo, pero en vez de
> > > > meter todo el archivo en memoria y recién ahí calcularle el MD5,
> > irás
> > > > leyendo por partes y actualizando el MD5 (método update) con esas
> > > > partes. Las partes ya leídas, dejan de ocupar memoria.
> > > >
> > > > Puede que esto te ayude a mejorar en algo la pérformance, pero lo
> > más
> > > > seguro es que por lo menos ocupará mucha menos memoria.
> > > >
> > > > Diego
> > > >
> > > > El 1/09/07, Martin Sagastume <[EMAIL PROTECTED]> escribió:
> > > > > 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
> > > > >
> > > > >
> > > > _______________________________________________
> > > > Ruby mailing list
> > > > [email protected]
> > > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > > >
> > > _______________________________________________
> > > Ruby mailing list
> > > [email protected]
> > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > >
> > _______________________________________________
> > 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