TL; DR використовують буфери, щоб не використовувати тонни пам'яті.
Я вважаю, що ми дійдемо до суті вашої проблеми, коли розглянемо наслідки роботи з дуже великими файлами для пам'яті . Ми не хочемо, щоб цей поганий хлопчик пробив 2 концерти оперативної пам'яті для файлу розміром 2 гігабайти, тому, як зазначає pasztorpisti , нам доведеться мати справу з цими більшими файлами шматками!
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 змінні, як правило, виділяються підкресленням, а не camelCased. Але це просто стиль, і ніхто насправді не піклується про ці речі, крім людей, яким доводиться читати поганий стиль ... а це, можливо, ви читаєте цей код через роки.