5

我有一个 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)])

提前感谢您的帮助!

4

4 回答 4

5

对于这类工作,我认为 multiprocessing.Pool 会给您带来更少的惊喜 - 查看http://docs.python.org/library/multiprocessing.html上的示例和文档

于 2012-04-12T20:06:19.133 回答
0

如果您要使用线程,您需要首先启动您的线程并让它们从 Queue.Queue 实例中轮询工作。然后在您的主线程中,运行您拥有的 for 循环,但不要调用 md5file(..),而是将所有参数推送到 Queue.Queue 上。 Python 中的线程/队列有一个示例,但也请查看文档:http ://docs.python.org/library/queue.html

于 2012-04-12T20:16:38.637 回答
0

使用 GIL(全局解释器锁)线程不会很有帮助。您的应用程序永远不会同时执行对 md5.update 函数的多次调用。我将继续尝试优化改进您的进程池。

于 2012-04-12T20:26:55.777 回答
0

尴尬地并行并为一大块文件启动一个进程。我们在集群上执行此操作。您可以有几十个或几百个进程,每个 md5ing 几十个文件。届时,磁盘 IO 将成为您的瓶颈。

于 2012-04-12T20:45:09.687 回答