【发布时间】:2014-11-28 11:13:55
【问题描述】:
我想遍历任何目录并可以计算每个文件的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 秒。
【问题讨论】:
-
对我来说,这个代码是最快的,池中只有 2 个进程(它会使用来自
os.cpu_count()的 8 个进程)。
标签: python multithreading python-2.7 multiprocessing checksum