Максимальное ограничение байтов в обновлении метода модуля Hashlib Python

Я пытаюсь вычислить хеш md5 файла с функцией hashlib.md5 () из модуля hashlib.

Чтобы я написал этот фрагмент кода:

Buffer = 128 f = open("c:\\file.tct", "rb") m = hashlib.md5() while True: p = f.read(Buffer) if len(p) != 0: m.update(p) else: break print m.hexdigest() f.close() 

Я заметил, что обновление функции происходит быстрее, если я увеличиваю значение переменной Buffer с помощью 64, 128, 256 и так далее. Существует ли верхний предел, который я не могу превысить? Полагаю, это может быть только проблема с памятью RAM, но я не знаю.

3 Solutions collect form web for “Максимальное ограничение байтов в обновлении метода модуля Hashlib Python”

Большие (≈ 2**40 ) размеры блоков приводят к MemoryError т. MemoryError Нет никакого предела, кроме доступной ОЗУ. С другой стороны, bufsize ограничивается 2**31-1 на моей машине:

 import hashlib from functools import partial def md5(filename, chunksize=2**15, bufsize=-1): m = hashlib.md5() with open(filename, 'rb', bufsize) as f: for chunk in iter(partial(f.read, chunksize), b''): m.update(chunk) return m 

Большой chunksize может быть столь же медленным, как очень маленький. Измерьте это.

Я нахожу, что для ≈ 10 МБ файлов 2**15 chunksize является самым быстрым для файлов, которые я тестировал.

Чтобы иметь возможность обрабатывать произвольно большие файлы, вам нужно их прочитать в блоках. Размер таких блоков должен быть предпочтительно равным 2, а в случае md5 минимально возможный блок состоит из 64 байтов (512 бит), поскольку 512-битные блоки являются единицами, на которых работает алгоритм.

Но если мы выйдем за это и попытаемся установить точный критерий, скажем, что 2048-байтовый блок лучше, чем 4096-байтовый блок … мы, скорее всего, потерпим неудачу. Это нужно тщательно проверять и измерять, и почти всегда ценность выбирается по желанию, судя по опыту.

Значение буфера – это количество байтов, которое считывается и сохраняется в памяти сразу, поэтому да, единственным ограничением является ваша доступная память.

Однако большие значения не будут автоматически быстрее. В какой-то момент вы можете столкнуться с проблемами подкачки памяти или другими замедлениями с распределением памяти, если буфер слишком велик. Вы должны экспериментировать с большими и большими значениями, пока не нажмете уменьшающуюся отдачу в скорости.

Python - лучший язык программирования в мире.