Java 7在文件夹中递归地并行搜索文件

时间:2013-06-28 13:16:13

标签: parallel-processing java-7 fork-join

我想使用Java 7中的Visitor API在文件夹中递归搜索某些文件。由于我将搜索大文件夹,包含100.000+文件,通过文件夹解析,我想并行执行此操作。

但是,我不能,例如,为每个文件夹生成一个线程。 May Fork Join可能是一个想法,但是从我所理解的情况来看,当您知道数据时通常会使用FJ,例如,您有一个给定的数组,并且您希望从中处理5个元素的部分。因此,在这种情况下可以很好地使用分而治之。

那么请您分享您对一个想法的看法,这个想法可以让我快速搜索文件(必须是并行的),并且如果用户需要也可以取消。

谢谢你, 柳

2 个答案:

答案 0 :(得分:2)

我敢打赌,单个磁盘驱动器上的并行搜索没有任何好处;磁盘访问/读取时间远远大于您可以进行的任何可能的名称比较。

你真的写了代码吗?你测试过吗?你有资料吗?你从剖析中扣除了什么?

请记住,优化的第一条规则是:don't do it

答案 1 :(得分:0)

你不能使用Files.walkFileTree(我认为这就是你说“Java 7中的访问者API”的意思);你必须自己实现目录遍历才能并行化。

实际上,fork / join确实非常适合这个问题。在Fork and Join: Java Can Excel at Painless Parallel Programming Too!甚至有一个相关的例子。该文章中有一个示例程序,通过遍历目录中的文件及其所有子目录(递归地)来“计算一组文档中单词的出现次数”。

作者在讨论部分提供了一些看似积极的加速测量,但你应该考虑Dariusz所说的问题可能是IO绑定而不是CPU绑定(即,只是抛出大量线程不会导致任何加速经过一些,可能是低线程数)。令人惊讶的是,至少在我看来,文章中的示例程序使用12个线程比8个线程更快。

取消,afaics,是一个正交问题,可以用某种标准方式实现(例如,轮询volatile标志)。