2010-12-11 46 views
0

J'écris une application p2p en Python et j'utilise le module hashlib pour identifier des fichiers avec le même contenu mais des noms différents dans le réseau. Le truc c'est que j'ai testé le code qui fait le hash pour les fichiers sous Windows (Vista), avec Python 2.7 et c'est très rapide (moins d'une seconde, pour quelques gigaoctets). Donc, sous Linux (Fedora 12, avec Python 2.6.2 et Python 2.7.1 compilé par moi-même car je n'ai pas trouvé de rpm avec yum) est tellement plus lent, presque une minute pour les fichiers de moins de 1Go.Hashlib sous Windows et Linux

La question est: Pourquoi? et Puis-je faire quelque chose pour améliorer les performances sous Linux?

Le code pour le hachage est

import hashlib 
... 

def crear_lista(directorio): 

    lista = open(archivo, "w") 

    for (root, dirs, files) in os.walk(directorio): 
     for f in files: 
     #archivo para hacerle el hash 
     h = open(os.path.join(root, f), "r") 

     #calcular el hash de los archivos 
     md5 = hashlib.md5() 

     while True: 
      trozo = h.read(md5.block_size) 
      if not trozo: break 
      md5.update(trozo) 

     #cada linea es el nombre de archivo y su hash 
     size = str(os.path.getsize(os.path.join(root, f))/1024) 
     digest = md5.hexdigest() 

     #primera linea: nombre del archivo 
     #segunda: tamaño en KBs 
     #tercera: hash 
     lines = f + "\n" + size + "\n" + digest + "\n" 
     lista.write(lines) 

     del md5 
     h.close() 

    lista.close() 

J'ai changé le r par rb et rU mais les résultats sont les mêmes

+0

Veuillez corriger vos blocs de code. – robert

Répondre

3

Vous lisez le fichier 64 octets (blocs) et hashlib.md5().block_size les hacher.

Vous devez utiliser une valeur de lecture beaucoup plus grande dans la plage de 256 Ko (262144 octets) à 4 Mo (4194304 octets), puis hacher cela; celui-ci digup programme lit en blocs de 1 Mo i.e .:

block_size = 1048576 # 1MB 
while True: 
    trozo = h.read(block_size) 
    if not trozo: break 
    md5.update(trozo)