读取网络驱动器上的所有文件和文件夹

时间:2019-08-19 08:06:04

标签: java parallel-processing

比方说,您有一个任务来读取保存在某个文件夹中的所有文件并处理每个文件。为了简单起见,假设所有文件都是HTML文件,并且您要从中提取HTML内容。

在Java 8中,有Files.walk API,它允许我们执行类似的操作。这是一个示例:

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
    paths
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
}

如果您必须处理少量的文件夹和文件,这听起来确实不错,但是如果您有数百万个文件分布在多个网络驱动器上,那么此过程将花费很长时间,并且显然需要进行并行处理。有什么想法在这种情况下如何进行并行化吗?

1 个答案:

答案 0 :(得分:0)

我认为没有简单的通用算法可以解决您的问题。

实际上,当处理分布在许多节点上的大量数据时,通常的想法是让每个节点对数据进行收集,并对部分结果进行处理。单节点。

很难在单个系统上进行所有扫描。

要进行真正的优化,您不能以相同的方式对待所有文件夹。

您可以做的是创建Collection的{​​{1}},可以对其进行并行扫描。

因此,您可以沿着多个文件夹(每个网络驱动器一个)开始多个 walks ,而不是沿着单个根目录进行 walking

要执行此操作,您需要知道哪个路径是网络路径,哪个是本地路径。

例如,如果您有一个文件夹,其中每个子文件夹都是一个已安装的网络驱动器,则可以轻松地收集所有这些文件夹,并对每个文件夹并行运行 walk

我会做类似于以下代码的事情:

Paths

这样,您的所有 local 目录将被顺序处理,所有网络驱动器都将在其线程上进行处理。

仅当您所有(或大多数)网络驱动器共享相同的挂载点父代时,它才起作用。

否则,您应该实现自己的 walk