TL; DR tonlarca bellek kullanmamak için tampon kullanır.
İnanıyorum ki, çok büyük dosyalarla çalışmanın hafıza sonuçlarını göz önünde bulundurduğumuzda, probleminizin özüne iniyoruz . Bu kötü çocuğun 2 gigabaytlık bir dosya için 2 g'lık ram karıştırmasını istemiyoruz, bu yüzden pasztorpisti'nin de belirttiği gibi , bu daha büyük dosyalarla yığınlar halinde uğraşmalıyız!
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()))
Yaptığımız şey, hashlib'in kullanışlı züppe güncelleme yöntemiyle birlikte ilerledikçe bu kötü çocuğun hash'lerimizi 64kb'lik parçalar halinde güncellemektir . Bu şekilde, adamı tek seferde hash etmek için gereken 2 gb'den çok daha az bellek kullanırız!
Bunu şununla test edebilirsiniz:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Umarım yardımcı olur!
Ayrıca bunların tümü sağ taraftaki bağlantılı soruda özetlenmiştir: Python'da büyük dosyaların MD5 karmasını alın
Zeyilname!
Genel olarak python yazarken pep-8'i takip etme alışkanlığı kazanmanıza yardımcı olur . Örneğin, python'da değişkenler tipik olarak camelCased değil alt çizgi ile ayrılmıştır. Ama bu sadece stil ve kötü stil okumak zorunda olan insanlar dışında hiç kimse bu şeyleri gerçekten önemsemiyor ... bu kodu yıllar sonra okuyabilirsiniz.