我有一个函数来检查目录中的文件是否包含字符串。
boolean processFiles(File file, String phrase) {
if (file.isFile()) {
return fileContains(file, phrase);
}
try (DirectoryStream<Path> stream = Files.newDirectoryStream(file.toPath())) {
for (Path entry: stream) {
if (processFiles(entry.toFile(), phrase) {
return true;
}
}
}
return false;
}
如果我有很多目录、子目录和文件,我如何使用并发性来提高性能?
我试图创建一个线程来处理每个子目录,但是如果有许多嵌套的子目录,我就会耗尽线程。
如果我们有很多子目录,那么使用固定大小的线程池也是有问题的,为了提高性能,在这里使用线程的最好方法是什么?
发布于 2018-10-23 19:08:52
如果我们有许多子目录,那么使用固定大小的线程池也是有问题的。
这是一个假设,它很简单:错误。
假设限制因素是线程数。但你凭什么这么想?更有可能的是,此操作的其他元素将限制整体性能,例如分别操作文件系统活动。准确地说:文件系统下面的驱动系统。
您知道,仅仅向任意问题抛出(无限)个线程,就不能使它们运行得更快。
如果你是认真的表现,停止作出假设。相反,开始测量。测试一个线程需要多少时间来“处理”一个更大的树。重复这样做(很可能在这里文件系统缓存将发挥很大的作用)。然后看看如果使用固定线程池会发生什么变化。
我的假设是:您将看到一定的加速,但很快,增加更多的线程将再次减慢速度。在这里猜测:一个拥有4,最多8个线程的池可能会给出“最佳”结果。
就实现而言,您可以将需要爬行的“新”子目录放到队列上,然后工作线程将它们从队列中取出以进行处理。
https://stackoverflow.com/questions/52956180
复制相似问题