2

我想使用 Java 7 中的 Visitor API 在文件夹中递归搜索一些文件。由于我将搜索包含 100.000 多个文件的大文件夹,这些文件在文件夹中稀疏,因此我想并行执行此操作。

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

因此,您能否分享您对一个想法的看法,该想法可以让我快速递归搜索文件(必须是并行的),并且如果用户愿意,也可以取消。

谢谢你,琉

4

2 回答 2

2

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

你真的写了代码吗?你测试了吗?你有介绍吗?你从分析中扣除了什么?

请记住,优化的第一条规则是:不要这样做

于 2013-06-28T13:21:18.673 回答
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标志)。

于 2013-06-28T17:11:50.070 回答