3

hashlib モジュールの関数hashlib.md5()を使用して、ファイルの md5 ハッシュを計算しようとしています。

だから私はこのコードを書いた:

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メモリの問題だけかもしれませんが、わかりません。

4

3 に答える 3

3

大きな(≈<code> 2 ** 40)チャンクサイズは、MemoryErrorつまり、使用可能なRAM以外に制限はありません。一方、私のマシンで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ものは非常に小さいものと同じくらい遅くなる可能性があります。それを測定します。

≈<code>10MBのファイルの場合、テストしたファイルの中で最も高速であることがわかり2**15 chunksizeました。

于 2011-02-11T00:38:42.240 に答える
2

任意の大きなファイルを処理できるようにするには、それらをブロック単位で読み取る必要があります。このようなブロックのサイズは2の累乗であることが望ましく、md5の場合、512ビットブロックはアルゴリズムが動作する単位であるため、可能な最小ブロックは64バイト(512ビット)で構成されます。

しかし、それを超えて、たとえば2048バイトのブロックが4096バイトのブロックよりも優れているかどうかの正確な基準を確立しようとすると、失敗する可能性があります。これは非常に注意深くテストおよび測定する必要があり、ほとんどの場合、経験から判断して、値は自由に選択されます。

于 2011-02-09T19:04:52.410 に答える
0

バッファ値は、一度に読み取られてメモリに格納されるバイト数であるため、そうです、唯一の制限は使用可能なメモリです。

ただし、値が大きいほど自動的に高速になるわけではありません。ある時点で、バッファーが大きすぎると、メモリ ページングの問題や、メモリ割り当てに関するその他の速度低下が発生する可能性があります。速度が低下するまで、値をどんどん大きくして実験する必要があります。

于 2011-02-09T19:01:22.077 に答える