如何有效地遍历目录并获取每个文件的sha256校验和

时间:2014-11-28 11:13:55

标签: python multithreading python-2.7 multiprocessing checksum

我想遍历任何目录并可用于计算每个文件的checkusum,目前我正在使用python multiprocessing以及以下代码:

import hashlib
import os
import time

from multiprocessing import Pool


def list_files(path):
    directories = []
    files = []

    def append_files(x):
        files.append(x)

    pool = Pool()

    src = os.path.abspath(os.path.expanduser(path))
    for root, dirs_o, files_o in os.walk(src):
        for name in dirs_o:
            directories.append(os.path.join(root, name))
        for name in files_o:
            file_path = os.path.join(root, name)
            if os.path.isfile(file_path):
                pool.apply_async(
                    sha256_for_file,
                    args=(file_path,),
                    callback=append_files)

    pool.close()
    pool.join()

    return directories, files

def sha256_for_file(path, block_size=4096):
    try:
        with open(path, 'rb') as rf:
            h = hashlib.sha256()
            for chunk in iter(lambda: rf.read(block_size), b''):
                h.update(chunk)
        return h.hexdigest(), path
    except IOError:
        return None, path

if __name__ == '__main__':
    start_time = time.time()

    d, f = list_files('~')
    print len(f)

    print '\n' + 'Elapsed time: ' + str(time.time() - start_time)      

代码正在使用python apply_async,我尝试使用mapmap_async但是在速度方面没有看到任何改进,我也试过ThreadPool但是变慢了。

from multiprocessing.pool import ThreadPool

pool = TreadPool()
...

如何优化代码或改进代码以便可以遍历大型目录并使用python 2.7计算每个文件的校验和?

在MacBook Pro(3GHz Intel Core i7,16 GB RAM 1600 MHz DDR3,SSD磁盘)上计算用户主页'〜'中所有文件( 215658 )的哈希值: 194.71100688 秒。

2 个答案:

答案 0 :(得分:0)

让我们仔细看看多线程部分。你的课程做了什么?

  1. 遍历目录
  2. 打开文件并计算其校验和
  3. 1 2 需要并发磁盘访问权限,而只有 2 执行实际计算。对于 1 2 步骤,使用不同的线程不会提高速度,因为此并发磁盘访问。但 2 可以分为两个不同的步骤:

    1. 遍历目录
    2. 打开文件并阅读其内容
    3. 计算内容的校验和
    4. 1 2 可能属于一个线程(磁盘访问,写入内存),而 3 可以在另一个线程中执行(读取内存,CPU计算)。

      但是,我不确定你会获得巨大的性能提升,因为哈希计算通常不会占用大量CPU:大部分计算时间可能用于磁盘读取...

答案 1 :(得分:0)

尝试测量函数sha256_for_file的集合执行时间。

如果它接近190秒,那么这是你应优化或并行化的代码片段(在一个线程中读取块,在第二个线程中计算)。