加快读取/散列数百万个文件/图像的速度

时间:2019-05-27 09:33:27

标签: python hash io

我的目录包含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来确认。我正在从硬盘读取。我已经阅读了有关内存映射的阅读,但是无法理解它是否适​​用于这种情况。

我的问题是:有没有一种方法可以优化这种阅读操作?

2 个答案:

答案 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个小时。

如果这是一项一次性任务,则只需将其设置为在夜间运行,然后在早上恢复工作时即可完成。如果您必须为一百万个文件建立索引,请在星期五晚上开始该过程,并在星期一进入办公室时完成。

如果这不是一项一次性任务,那么您还有其他问题。 。