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

Parallel processing Java 7在文件夹中递归地并行搜索文件,parallel-processing,java-7,fork-join,Parallel Processing,Java 7,Fork Join,我想使用Java 7中的Visitor API递归地搜索文件夹中的一些文件。因为我会搜索大文件夹,有100.000多个文件,通过文件夹稀疏,我想做这个并行 但是,例如,我不能为每个文件夹生成一个线程。May Fork Join可能是一个想法,但据我所知,当您知道数据时,通常会使用FJ,例如,您有一个给定的数组,并且希望从中处理5个元素的一部分。因此,在这种情况下,分而治之可以很好地使用 因此,你能分享你的想法,可以让我快速递归搜索文件(必须是并行的),并允许取消,如果用户希望这样做 谢谢,, R

我想使用Java 7中的Visitor API递归地搜索文件夹中的一些文件。因为我会搜索大文件夹,有100.000多个文件,通过文件夹稀疏,我想做这个并行

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

因此,你能分享你的想法,可以让我快速递归搜索文件(必须是并行的),并允许取消,如果用户希望这样做

谢谢,,
Ryu

我打赌在单个磁盘驱动器上进行并行搜索不会有任何好处;磁盘访问/读取时间比任何可能的名称比较都要长

你真的写代码了吗?你测试过了吗?你分析过它吗?你从分析中扣除了什么


请记住,优化的第一条规则是:。

您不能为此使用
文件.walkFileTree
(我假设这就是您所说的“Java 7中的访问者API”的意思);您必须自己实现目录遍历,才能将其并行化

实际上,Fork/join非常适合这个问题。甚至还有一个相关的例子。文章中有一个示例程序,通过遍历目录及其所有子目录(递归)中的文件,“计算一组文档中某个单词的出现次数”

作者在讨论部分中提供了一些看似积极的加速测量,但是你应该考虑Dariusz关于这个问题的说法可能是IO绑定而不是CPU绑定(即,仅仅在其上抛出许多线程不会在一些可能的低线程数之后加速)。令人惊讶的是,至少对我来说,文章中的示例程序使用12个线程比使用8个线程更快


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

嗨,Darius,我正是在考虑评测,但问题是我不知道如何并行实现,以便将其与单线程进行比较。但我认为我有一个2核的CPU和超线程,所以理论上,如果我每线程分发20000个文件,它应该会更快,不是吗?当我回到家中时,我会发布一些单线程文件的数字。@您必须分析单线程版本,并检查哪个任务花费的时间最多。您可能会看到,90%的工作时间用于磁盘访问功能,其余10%用于比较文件/文件夹的名称。如果您将这项工作分成两个核心,您可能会获得大约4%的收益(同步开销约为1%)。您可以在执行搜索时进一步进行比较,但这更复杂。那么收益将是9-10%。这工作值得吗?