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
