我有一个python脚本,递归地遍历指定的目录,并校验它找到的每个文件。然后它会写一个日志文件,列出所有文件路径及其md5校验和。
顺序地,这需要很长时间才能获得50,000个文件,每个文件15 MB。但是,我的计算机拥有的资源比实际使用的资源多得多。如何调整我的方法以便脚本使用更多资源来更快地执行?
例如,我可以将文件列表拆分为三分之一并为每个文件运行一个线程,为我提供3倍的运行时间吗?
我对线程不太满意,我希望有人不介意为我的案例鞭打和示例。
这是我的顺序md5循环的代码:
for (root, dirs, files) in os.walk(root_path):
for filename in files:
file_path = root + "/" + filename
md5_pairs.append([file_path, md5file(file_path, 128)])
提前感谢您的帮助!
答案 0 :(得分:5)
对于这种工作,我认为多处理.Pool会给你更少的惊喜 - 查看http://docs.python.org/library/multiprocessing.html
上的示例和文档答案 1 :(得分:0)
如果您要使用线程,则需要首先启动线程并让它们在Queue.Queue实例上进行轮询。然后在你的主线程中,运行你拥有的for循环,但不是调用md5file(..),而是推送Queue.Queue上的所有参数。 Threading / Queue in Python有一个示例,但也请查看文档:{{3}}
答案 2 :(得分:0)
GIL(全局解释器锁定)对线程没有多大帮助。你的应用程序永远不会同时执行多次调用md5.update函数。我会继续尝试优化改进您的流程池。
答案 3 :(得分:0)
尴尬地并行并为一大块文件启动一个进程。我们在集群上这样做。你可以拥有数十个或数百个进程,每个进程只有几十个文件。此时,磁盘IO将成为您的瓶颈。