TL; DRは、大量のメモリを使用しないようにバッファを使用します。
非常に大きなファイルを操作することによるメモリへの影響を考慮すると、問題の核心に到達すると思います。この悪い子が2ギガバイトのファイルに対して2ギガバイトのRAMをチャーンしないようにしたいので、pasztorpistiが指摘するように、これらの大きなファイルをチャンクで処理する必要があります。
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()))
これで、hashlibの便利なdandy 更新メソッドに合わせて、この不良少年のハッシュを64kbのチャンクに更新しました。この方法では、一度に男をハッシュするのに必要な2GBよりもはるかに少ないメモリを使用します!
これは次の方法でテストできます。
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
お役に立てば幸いです。
また、このすべては右側のリンクされた質問で概説されています:Pythonで大きなファイルのMD5ハッシュを取得する
補遺!
一般に、Pythonを作成するときは、pep-8をフォローする習慣をつけるのに役立ちます。たとえば、Pythonでは通常、変数はキャメルケースではなくアンダースコアで区切られます。しかし、それは単なるスタイルであり、悪いスタイルを読まなければならない人々を除いて、誰もこれらのことを気にしません...これは、このコードを数年後に読むかもしれません。