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
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a