首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同时处理目录和子目录中的文件

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

Stack Overflow用户
提问于 2018-10-23 19:02:13
回答 1查看 108关注 0票数 1

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

代码语言:javascript
运行
复制
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;
}

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

我试图创建一个线程来处理每个子目录,但是如果有许多嵌套的子目录,我就会耗尽线程。

如果我们有很多子目录,那么使用固定大小的线程池也是有问题的,为了提高性能,在这里使用线程的最好方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 19:08:52

如果我们有许多子目录,那么使用固定大小的线程池也是有问题的。

这是一个假设,它很简单:错误。

假设限制因素是线程数。但你凭什么这么想?更有可能的是,此操作的其他元素将限制整体性能,例如分别操作文件系统活动。准确地说:文件系统下面的驱动系统。

您知道,仅仅向任意问题抛出(无限)个线程,就不能使它们运行得更快。

如果你是认真的表现,停止作出假设。相反,开始测量。测试一个线程需要多少时间来“处理”一个更大的树。重复这样做(很可能在这里文件系统缓存将发挥很大的作用)。然后看看如果使用固定线程池会发生什么变化。

我的假设是:您将看到一定的加速,但很快,增加更多的线程将再次减慢速度。在这里猜测:一个拥有4,最多8个线程的池可能会给出“最佳”结果。

就实现而言,您可以将需要爬行的“新”子目录放到队列上,然后工作线程将它们从队列中取出以进行处理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52956180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档