Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同时处理目录和子目录中的文件_Java_Multithreading_Concurrency_Executorservice - Fatal编程技术网

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

Java 同时处理目录和子目录中的文件,java,multithreading,concurrency,executorservice,Java,Multithreading,Concurrency,Executorservice,我有一个函数,检查目录中的文件是否包含一些字符串 boolean processFiles(File file, String phrase) { if (file.isFile()) { return fileContains(file, phrase); } try (DirectoryStream<Path> stream = Files.newDirectoryStream(file.toPath())) {

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

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;
}
boolean进程文件(文件文件、字符串短语){
if(file.isFile()){
返回文件包含(文件、短语);
}
try(DirectoryStream=Files.newDirectoryStream(file.toPath())){
for(路径条目:流){
if(processFiles(entry.toFile(),短语){
返回true;
}
}
}
返回false;
}
如果我有许多目录、子目录和文件,如何使用并发来提高性能

我试图创建一个线程来处理每个子目录,但是如果有很多嵌套的子目录,我的线程就用完了

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

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

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

您假设限制因素是线程数。但您为什么这么认为?此操作的其他元素更有可能限制总体性能,例如分别操作文件系统活动。确切地说,是文件系统下面的驱动器系统

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

如果你对性能很认真,停止假设。相反,开始测量。测试一个线程“处理”一个更大的树需要多少时间。重复这样做(很可能文件系统缓存会在这里扮演重要角色)。然后看看如果你使用固定的线程池会有什么变化

我的假设是:您将看到一定的加速,但很快,添加更多线程将再次降低速度。猜测一下:一个包含4个,最多8个线程的池可能会给您“最佳”结果


在实现方面,您可以使用“新”需要在队列上爬网的子目录,然后您的工作线程将它们从队列中取出进行处理。

您可以爬网文件夹/处理文件的时间也在很大程度上取决于服务器/计算机中驱动器的速度。您遇到的与CPU速度有关的问题是否与此相关?您认为您的性能如何ues?此外,是什么让你认为有100个线程同时访问,你会得到更多的性能?磁盘通常不喜欢随机访问。尝试使用并行流。这里可以找到一个例子:如果你的问题是磁盘IO,添加更多线程将不会有帮助,真的。如果你的问题是CPU,添加更多线程也不会有帮助。如何处理你的CPU/系统有ny内核吗?一旦你的CPU被最大化,更多的线程会减慢速度。processFiles在做什么?它是非常CPU密集型的吗?我很欣赏它的快速恢复!