Python MD5 Hash Faster Расчет - PullRequest
       16

Python MD5 Hash Faster Расчет

2 голосов
/ 11 мая 2010

Я сделаю все возможное, чтобы объяснить мою проблему и мой взгляд на то, как, по моему мнению, я могу ее решить.

Я использую этот код

    for root, dirs, files in os.walk(downloaddir):
for infile in files:
    f = open(os.path.join(root,infile),'rb')
    filehash = hashlib.md5()
    while True:
        data = f.read(10240)
        if len(data) == 0:
            break
        filehash.update(data)
    print "FILENAME: " , infile
    print "FILE HASH: " , filehash.hexdigest()

и используя start = time.time () elapsed = time.time () - start я измеряю, сколько времени потребуется для вычисления хеша. Указывая мой код в файл с 653 мегабайтами, это результат:

root@Mars:/home/tiago# python algorithm-timer.py 
FILENAME:  freebsd.iso
FILE HASH:  ace0afedfa7c6e0ad12c77b6652b02ab
          12.624
root@Mars:/home/tiago# python algorithm-timer.py 
FILENAME:  freebsd.iso
FILE HASH:  ace0afedfa7c6e0ad12c77b6652b02ab
          12.373
root@Mars:/home/tiago# python algorithm-timer.py 
FILENAME:  freebsd.iso
FILE HASH:  ace0afedfa7c6e0ad12c77b6652b02ab
          12.540

Хорошо, теперь 12 секунд + - для файла размером 653 МБ моя проблема в том, что я собираюсь использовать этот код в программе, которая будет работать с несколькими файлами, некоторые из них могут быть 4/5/6 ГБ, и это займет гораздо больше времени вычислить. Интересно, есть ли для меня более быстрый способ вычислить хеш файла? Может быть, занимаясь многопоточностью? Я использовал другой скрипт, чтобы проверять использование процессора по секундам, и я вижу, что мой код использует только 1 из моих 2 процессоров и только при 25% макс. Как-нибудь я могу это изменить?

Заранее всем спасибо за предоставленную помощь.

Ответы [ 4 ]

4 голосов
/ 11 мая 2010

Расчет хеша в вашем случае почти наверняка будет привязан к вводу / выводу (если вы не будете запускать его на машине с очень медленным процессором), поэтому многопоточность или обработка нескольких файлов одновременно, вероятно, не дадут ожидаемого результаты.

Возможно, поможет размещение файлов на нескольких дисках или на более быстром (SSD) диске, даже если это не то решение, которое вам нужно.

2 голосов
/ 11 мая 2010

Для чего это стоит, делая это:

c:\python\Python.exe c:\python\Tools\scripts\md5sum.py cd.iso

занимает 9,671 секунды на моем ноутбуке (2 ГГц Core2 Duo с жестким диском SATA на 80 ГБ для ноутбука).

Как уже упоминали другие, MD5 связаны с диском, но ваш 12-секундный тест, вероятно, довольно близок к быстрейшему, который вы могли получить.

Кроме того, в python md5sum.py для размера буфера используется 8096 (хотя я уверен, что они имели в виду 4096 или 8192).

2 голосов
/ 11 мая 2010

Разве дисковые операции не являются здесь узким местом? Предполагая скорость чтения 80 МБ / с (так работает мой жесткий диск), чтение файла занимает около 8 секунд.

1 голос
/ 12 мая 2010

Это помогло мне увеличить размер буфера до определенного уровня.Я начал с 1024 и умножил его на 2 ^ N, увеличивая N каждый раз, начиная с 1. С помощью этого метода я обнаружил, что в моей системе размер буфера 65536, казалось, был примерно таким же хорошим, как и при получении.Тем не менее, это дало мне только 7% улучшение во время работы.

Профилирование показало, что около 80% времени тратится на метод обновления MD5, а остальные 20% считываются в файле.Поскольку MD5 является последовательным алгоритмом, а алгоритм Python уже реализован на C, я не думаю, что вы можете многое сделать для ускорения части MD5.Вы можете попробовать рассчитать MD5 для двух разных файлов параллельно, но, как все говорили, вы в конечном итоге будете ограничены скоростью доступа к диску.

...