0

Python で p2p アプリケーションを作成しており、hashlib モジュールを使用して、ネットワーク内で同じ内容で名前が異なるファイルを識別しています。

問題は、Python 2.7 を使用して、Windows (Vista) でファイルのハッシュを行うコードをテストしたところ、非常に高速でした (数ギガバイトで 1 秒未満)。そのため、Linux (Fedora 12、Python 2.6.2 および Python 2.7.1 を使用して、yum を使用した rpm が見つからなかったため、自分でコンパイル) は非常に遅く、1 GB 未満のファイルの場合はほぼ 1 分です。

問題は、なぜですか?Linux のパフォーマンスを向上させるために何かできることはありますか?

ハッシュのコードは

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()

rbyrbを変更しましrUたが、結果は同じです

4

1 に答える 1

3

ファイルを 64 バイト ( hashlib.md5().block_size) ブロックで読み取り、それらをハッシュしています。

256KB (262144 バイト) から 4MB (4194304 バイト) の範囲のはるかに大きな読み取り値を使用し、それをハッシュする必要があります。この 1 つのdigupプログラムは 1MB ブロックを読み取ります。

block_size = 1048576 # 1MB
while True:
    trozo = h.read(block_size)
    if not trozo: break
    md5.update(trozo)
于 2010-12-11T18:08:10.880 に答える