gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:15:00 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

关于java - 同时处理目录和子目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52956180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com