我的目录包含100K-1百万张图片。我将为每个图像创建一个哈希,以便将来可以基于这些哈希找到完全匹配的图像。我目前的方法是:
def hash_test(images): # images is a list of image paths
hashes = []
for image in images:
with open(folder + image, 'rb', buffering=0) as f:
hashes.append(hashlib.sha256(f.read()).hexdigest())
# hashes.append(CityHash128(f.read()))
return hashes
31%|███ | 102193/334887 [00:04<42:15, 112.02it/s]
根据我的实验结果,file.read()
操作是我的瓶颈,这意味着我受I / O约束。也可以通过选中iotop
来确认。我正在从硬盘读取。我已经阅读了有关内存映射的阅读,但是无法理解它是否适用于这种情况。
我的问题是:有没有一种方法可以优化这种阅读操作?
答案 0 :(得分:1)
您可以尝试并行化您的哈希计算代码,如下所示。但是,性能取决于磁盘可以处理多少并行IO请求以及CPU具有多少个内核。但是,您可以尝试。
from multiprocessing import Pool
# This function will return hashes as list
# Will wait for all parallel hash computation to complete
def parallel_hash(images):
with Pool(5) as pool:
return pool.map(hash_test, images)
def hash_test(image): # images is a list of image paths
with open(folder + image, 'rb', buffering=0) as f:
return hashlib.sha256(f.read()).hexdigest()
# hashes.append(CityHash128(f.read()))
parallel_hash(images)
答案 1 :(得分:0)
问题还可能与目录中的文件数有关。当您在单个目录中获得成千上万个文件时,某些文件系统的性能会严重下降。如果单个目录中有100K或更多文件,则在打开和读取文件之前,文件系统要花费大量时间查找。
也就是说,让我们考虑一下。如果我正确地读取了输出,则您的程序在4小时42分钟内完成了335K文件中的大约102K。以整数表示,每秒大约6个文件。因此,处理全部335K文件大约需要15.5个小时。
如果这是一项一次性任务,则只需将其设置为在夜间运行,然后在早上恢复工作时即可完成。如果您必须为一百万个文件建立索引,请在星期五晚上开始该过程,并在星期一进入办公室时完成。
如果这不是一项一次性任务,那么您还有其他问题。 。