我想遍历任何目录并可用于计算每个文件的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
,我尝试使用map
和map_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 秒。
答案 0 :(得分:0)
让我们仔细看看多线程部分。你的课程做了什么?
1 和 2 需要并发磁盘访问权限,而只有 2 执行实际计算。对于 1 和 2 步骤,使用不同的线程不会提高速度,因为此并发磁盘访问。但 2 可以分为两个不同的步骤:
1 和 2 可能属于一个线程(磁盘访问,写入内存),而 3 可以在另一个线程中执行(读取内存,CPU计算)。
但是,我不确定你会获得巨大的性能提升,因为哈希计算通常不会占用大量CPU:大部分计算时间可能用于磁盘读取...
答案 1 :(得分:0)
尝试测量函数sha256_for_file
的集合执行时间。
如果它接近190秒,那么这是你应优化或并行化的代码片段(在一个线程中读取块,在第二个线程中计算)。