¿Y para qué necesitás hashear el archivo entero?
¿Por qué no hasheas solo los primeros 64K (por ejemplo) o todo el
archivo si es más chico?
Salvo que estés haciendo algo bastante extraño, esto debería mostrarte
si son distintos o no y te ahorrás de leer el archivo. Si da igual
(casi nunca), podés leer el archivo entero.
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
> _______________________________________________
> 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