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()))
우리가 한 것은 hashlib의 편리한 멋쟁이 업데이트 방법 과 함께 진행하면서이 나쁜 소년의 해시를 64kb 청크로 업데이트하는 것 입니다. 이런 식으로 우리는 한 번에 해시하는 데 걸리는 2GB보다 훨씬 적은 메모리를 사용합니다!
다음과 같이 테스트 할 수 있습니다.
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
도움이 되었기를 바랍니다.
또한이 모든 내용은 오른쪽의 링크 된 질문에 설명되어 있습니다. Python에서 큰 파일의 MD5 해시 가져 오기
추가!
일반적으로 파이썬을 작성할 때 pep-8 을 따르는 습관을들이는 것이 도움이됩니다 . 예를 들어, 파이썬에서 변수는 일반적으로 camelCased가 아닌 밑줄로 구분됩니다. 그러나 그것은 단지 스타일 일 뿐이고 나쁜 스타일을 읽어야하는 사람들을 제외하고는 아무도 그런 것들을 신경 쓰지 않습니다.