3

我正在考虑一种在目录树上进行多线程递归遍历的好方法。

我现在正在做的是获取根目录下的文件夹并在单独的线程中对每个文件夹运行递归遍历。

这大大提高了性能,但我仍然有一个“长尾”问题 - 大文件夹需要很多时间。

有什么方法比这更好?

我为此使用python和java。

谢谢。

编辑:我不需要将文件加载到内存中。只需处理文件路径,并可能获取一些元数据信息,如文件大小。

4

2 回答 2

0

这是错误的方法,因为您不知道目录节点的深度和大小。即使您知道,在目录树上的迭代本身也不会通过在多个线程中执行来加速。您要做的是在单个线程中遍历目录并将您在文件/目录上所做的工作提交给ExecutorService。另见执行者

于 2012-08-14T13:41:07.560 回答
0

好吧,严格回答多线程问题,您可以提出一些规则,以便在递归中剥离新线程,例如,每个甚至填充的深度都被拆分为线程。在 Python 式的伪代码中观察:

depth = 0
while true:
    subDirCount = countSubDirs()
    if subDirCount = 0:
        break
    else:
        if depth % 2 = 0:
            for dir in subDirs:
                newThread(dir)
        else:
            for dir in subDirs:
                recurse(dir)

现在这个解决方案不能处理你在线程安全方面的可怕时间。这是您将要获得的不稳定异步返回的最佳设置。

于 2012-08-14T14:05:10.423 回答