我正在考虑在目录树上进行多线程递归遍历的好方法。
我现在正在做的是将根文件夹下的文件夹放在一个单独的线程中对每个文件夹进行递归遍历。
这提高了性能,但我仍有“长尾”问题 - 大文件夹需要花费大量时间。
哪种方法比这更好?
我正在使用python和java。
感谢。
编辑: 我不需要将文件加载到memrory中。只处理文件路径,并可能采取一些元数据信息,如文件大小。
答案 0 :(得分:0)
这是错误的方法,因为您不知道目录节点的深度和大小。即使你知道,在多个线程中执行它也不会加速目录树上的迭代本身。您要做的是迭代单个线程中的目录,并将您在文件/目录上执行的工作提交到ExecutorService。 另请参阅Executors
答案 1 :(得分:0)
那么,严格地回答多线程问题,你可以想出一些规则,在递归中你分离新线程,例如,每个偶数填充的深度都被分成线程。用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)
现在这个解决方案不会处理thread-safety所带来的可怕的时间。这是一个很好的设置,可以获得非常好的异步返回。