TL; DR используйте буферы, чтобы не использовать тонны памяти.
Я считаю, что мы подходим к сути вашей проблемы, когда рассматриваем последствия для памяти при работе с очень большими файлами . Мы не хотим, чтобы этот плохой мальчик потратил 2 гигабайта оперативной памяти на 2-гигабайтный файл, поэтому, как указывает пасторписти , мы должны обрабатывать эти большие файлы кусками!
import sys
import hashlib
BUF_SIZE = 65536
md5 = hashlib.md5()
sha1 = hashlib.sha1()
with open(sys.argv[1], 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
md5.update(data)
sha1.update(data)
print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))
Что мы сделали, так это обновили наши хэши этого плохого парня кусками по 64 КБ, следуя удобному методу обновления hashlib . Таким образом, мы используем намного меньше памяти, чем 2 ГБ, которые потребовались бы для хеширования всего парня сразу!
Вы можете проверить это с помощью:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Надеюсь, это поможет!
Также все это описано в связанном вопросе справа: Получить хэш MD5 больших файлов в Python
Дополнение!
В общем, при написании python это помогает привыкнуть следовать pep-8 . Например, в Python переменные обычно разделяются подчеркиванием, а не верблюжьим регистром. Но это всего лишь стиль, и никого не волнуют эти вещи, кроме людей, которым приходится читать плохой стиль ... который, возможно, вы читаете этот код через годы.