【发布时间】:2020-07-15 21:02:57
【问题描述】:
我想计算同一个文件的多个哈希值并通过多处理来节省时间。
据我所见,从 ssd 读取文件相对较快,但哈希计算几乎慢了 4 倍。如果我想计算 2 个不同的哈希值(md5 和 sha),它会慢 8 倍。我希望能够在不同的处理器内核上并行计算不同的哈希值(最多 4 个,具体取决于设置),但不明白如何绕过 GIL。
这是我当前的代码 (hash.py):
import hashlib
from io import DEFAULT_BUFFER_SIZE
file = 'test/file.mov' #50MG file
def hash_md5(file):
md5 = hashlib.md5()
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
md5.update(chunk)
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return md5.hexdigest()
def hash_sha(file):
sha = hashlib.sha1()
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
sha.update(chunk)
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return sha.hexdigest()
def hash_md5_sha(file):
md5 = hashlib.md5()
sha = hashlib.sha1()
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
md5.update(chunk)
sha.update(chunk)
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return md5.hexdigest(), sha.hexdigest()
def read_file(file):
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return
我做了一些测试,结果如下:
from hash import *
from timeit import timeit
timeit(stmt='read_file(file)',globals=globals(),number = 100)
1.6323043460000122
>>> timeit(stmt='hash_md5(file)',globals=globals(),number = 100)
8.137973076999998
>>> timeit(stmt='hash_sha(file)',globals=globals(),number = 100)
7.1260356809999905
>>> timeit(stmt='hash_md5_sha(file)',globals=globals(),number = 100)
13.740918666999988
这个结果应该是一个函数,主脚本将遍历文件列表,并且应该检查不同文件的不同哈希值(从 1 到 4)。 有什么想法可以实现吗?
【问题讨论】:
-
您可以使用
concurrent.futures类中的PoolProcessExecutor()方法。我相信这会帮助你实现你想要的。您可以在此处找到该库的更多详细信息:concurrent.futures
标签: python multithreading hash md5 sha