同时处理目录和子目录中的文件

Process files in directories and sub-directories concurrently

我有一个函数可以检查目录中的文件是否包含一些字符串

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;
}

如果我有很多目录、子目录和文件,如何使用并发来提高性能?

我试图创建一个线程来处理每个子目录,但是我 运行 线程不足以防有很多嵌套的子目录

如果我们有很多子目录,使用固定大小的线程池也是有问题的 此处使用线程以提高性能的最佳方法是什么?

Using a fixed-size thread pool is also problematic in case we have a many sub-directories

那是一个假设,而且很简单:错误。

假设限制因素是线程数。但是是什么让你这么想呢?更有可能的是other这个操作的元素会限制整体性能,比如分别操作文件系统activity。准确的说:文件系统下面的驱动系统。

你看,你不能让任意问题更快仅仅通过向它们抛出(无限)数量的线程。

如果您认真对待性能,请停止做出假设。相反,开始测量。测试 1 个线程 "process" 一棵更大的树需要多少时间。重复执行此操作(很可能文件系统缓存将在这里发挥重要作用)。然后看看如果使用固定线程池有什么变化。

我的假设是:您会看到一定的加速,但相当快,添加更多线程会再次减慢速度。在这里猜测:一个有 4 个线程的池,最多 8 个线程可能会给你 "optimal" 个结果。

在实现方面,您可以将需要爬取的 "new" 个子目录放在队列中,然后您的工作线程从队列中取出它们进行处理。