Это ссылка на Get MD5 hash of big files in Python и Hashlib in Windows and LinuxHashlib: оптимальный размер кусков, которые будут использоваться в md5.update()
В ответах на оба эти вопроса, рекомендуется использовать большие массивы данных в функции md5 .update() для повышения производительности.
Все испытания, которые я выполнил, показывают, что использование меньших кусков дает наилучшую производительность.
Рассмотрим следующий код:
def test(factor):
filehash = hashlib.md5()
blk_size_to_read = filehash.block_size * (2**factor)
with open(largetestfile, 'rb') as f:
read_data = f.read(blk_size_to_read)
filehash.update(read_data)
filehash.digest()
if __name__ == '__main__':
for ctr in xrange(0, 12):
funcstr = "test({})".format(str(ctr))
timetaken = timeit.timeit(funcstr, setup="from __main__ import test", number = 5000)
print "Factor: {} Time: {}".format(str(ctr), str(timetaken))
Все тесты, которые я сделал, показывают, что наилучшая производительность достигается при использовании factor
0 или 1 (то есть, 64 или 128 байт).
Любая причина, по которой я вижу разные результаты, указанные в указанных цитатах?
Я попытался бинарные и текстовые файлы с размером от 700Мб до 1.2GB и я использую Python 2.7.3 на Ubuntu 12.04
Вторичный вопрос: я использую timeit, как это должно быть?
Для любопытства вы можете рассказать нам, что вы нашли оптимальным размером куска? – 2rs2ts
Производительность будет асимптотически увеличиваться в сторону максимального теоретического уровня вашей системы, запускающей код md5 по мере увеличения размера вашего куска. К тому времени, когда вы буферизируете 1MiB, любое увеличение скорости уже давно стало неуместным. Если вы хотите выбрать произвольный размер буфера, я предлагаю 128k. Это относится ко всем хэш-функциям. – gps
@ 2rs2ts оптимальный размер - 65536 байт. См. Обновление моего ответа выше. – Verma