我正在考虑一种对目录树进行多线程递归遍历的好方法。
我现在要做的是将文件夹放在根目录下,并在单独的线程中对每个文件夹运行递归遍历。
这改善了相当多的性能,但我仍然有一个“长尾”的问题-大文件夹花了很多时间。
有什么办法比这更好呢?
为此,我使用python和java。
谢谢。
编辑:我不需要将文件加载到记忆中。只需处理文件路径并可能获取一些元数据信息,如文件大小。
发布于 2012-08-14 13:41:07
这是错误的方法,因为您不知道目录节点的深度和大小。即使您知道,迭代本身在目录树上的也不会通过在多个线程中执行而加速。您想要做的是在单个线程中遍历目录,并将您在文件/目录上所做的工作提交给ExecutorService。还请参见遗嘱执行人
发布于 2012-08-14 14:05:10
那么,严格地回答多线程问题,您可以想出一些规则,以便在递归中分离出新的线程,例如,每个均匀填充的深度都被分割成线程。在Python-esque伪代码中观察:
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)现在,这个解决方案并不能处理您在使用螺纹安全时遇到的可怕时刻。这是一个很好的设置,不稳定的异步返回,你将得到。
https://stackoverflow.com/questions/11952989
复制相似问题