TL; DR utilise des tampons pour ne pas utiliser des tonnes de mémoire.
Nous arrivons au cœur de votre problème, je crois, lorsque nous considérons les implications mémoire du travail avec de très gros fichiers . Nous ne voulons pas que ce mauvais garçon produise 2 Go de RAM pour un fichier de 2 Go , donc, comme le souligne pasztorpisti , nous devons traiter ces fichiers plus gros par morceaux!
import sys
import hashlib
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
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()))
Ce que nous avons fait, c'est que nous mettons à jour nos hachages de ce mauvais garçon en morceaux de 64 Ko au fur et à mesure que nous suivons la méthode pratique de mise à jour dandy de hashlib . De cette façon, nous utilisons beaucoup moins de mémoire que les 2 Go qu'il faudrait pour hacher le gars en même temps!
Vous pouvez tester cela avec:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
J'espère que cela pourra aider!
Tout cela est également décrit dans la question liée sur le côté droit: Obtenez le hachage MD5 de gros fichiers en Python
Addenda!
En général, lors de l'écriture de python, il est utile de prendre l'habitude de suivre pep-8 . Par exemple, en python, les variables sont généralement séparées par des traits de soulignement et non par camelCased. Mais ce n'est que du style et personne ne se soucie vraiment de ces choses, sauf les gens qui doivent lire le mauvais style ... ce qui pourrait être vous en lisant ce code dans des années.