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

Responder a