Java 从同一文件读取的多个流

Java 从同一文件读取的多个流,java,parallel-processing,java-8,java-stream,Java,Parallel Processing,Java 8,Java Stream,我有许多输入文件,我并行读取这些文件,并对我读取的每一行执行计算。然而,对于每个文件中的每一行,我需要访问大约一百个文件中的一个,循环遍历整个文件,并将每个组合写入一个输出文件 因此,基本上,我有这样的注释,我只添加了代码的关键部分: 实际上,两个输入文件可以同时从这一百个共享文件中的同一个读取。 最终的结果是,其中一个输出文件总是完全完成,就像它应该完成的那样,而所有其他输出文件都有开始的几行,然后它们过早地结束 我甚至可以通过多个流读取同一个共享文件吗?我的印象是,通过多个资源读取同一个文件

我有许多输入文件,我并行读取这些文件,并对我读取的每一行执行计算。然而,对于每个文件中的每一行,我需要访问大约一百个文件中的一个,循环遍历整个文件,并将每个组合写入一个输出文件

因此,基本上,我有这样的注释,我只添加了代码的关键部分:

实际上,两个输入文件可以同时从这一百个共享文件中的同一个读取。 最终的结果是,其中一个输出文件总是完全完成,就像它应该完成的那样,而所有其他输出文件都有开始的几行,然后它们过早地结束


我甚至可以通过多个流读取同一个共享文件吗?我的印象是,通过多个资源读取同一个文件很好,但编写可能会有问题?在Java8流中是否有一个等效于synchronized的方法来确保一个流当前只从一个文件读取

你好,并行读取文件是一个非常糟糕的主意。因为你的硬件,你的硬盘受到一些限制。比如说每秒700MB。在某一点上,无论您以并行方式阅读了多少内容,最终您都不会看到任何性能提升。尝试以并行方式优化数据处理,而不是以IO方式访问磁盘


虽然不是真正的答案。我给你的建议是把一个一个的所有文件读入内存,或者尽可能多地读入内存。然后在赋值的处理部分执行多线程处理,而不是文件读取。

如果您使用的是Java 8,请帮自己一个忙,使用来正确关闭流。这不是java8流,代码是在java7和java8之间使用{}如果超过一行,则不建议使用。您是否尝试从一个文件读取并写入另一个文件?是的,我没有读取和写入相同的文件。我将此文件发送到网格,因此硬件确实没有问题。您是说这些文件位于网格中吗?或者你的意思是,在你并行阅读它们之后,你正在将内容上传到网格中。我正在将可执行文件.jar以及所有需要读取的必要输入文件和共享文件发送到网格中。所以,是的,它们都在上面。一旦创建了输出文件,我就从网格中获取它们。但是您最初不是从磁盘读取文件吗?阅读是制约你的因素。问题是,我不确定我是否能将所有共享文件都读入内存,因为有很多共享文件,而且它们很大,而且我已经在计算中使用了相当多的内存。这就是为什么我要在手术期间阅读他们,以防止任何与记忆有关的问题。处理不是这里最难的部分。事实上,我有很多输入文件。这就是为什么我一开始就对文件进行并行处理。
int numberOfFiles = (int) new File("path/").listFiles().length;

IntStream.range(0, numberOfFiles).parallel().forEach(k -> { 
    BufferedWriter bw = null;
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(new File("priorityQueuePreTerminal"+k+".txt")));
        bw = new BufferedWriter(new FileWriter(new File("priorityQueuePostTerminal"+k+".txt"), true));
        ...
        try {
            while( (line = br.readLine()) != null ){ 
            ...
                BufferedReader br2 = new BufferedReader(new FileReader(new File("shared/"+i+".txt")));
                while( (line2 = br2.readLine()) != null ){ 
                    bw.write(...);
                }
            }
        } catch (Exception e) { } finally { br2.close(); }
    } catch (Exception e) { } finally { br.close(); bw.close(); }
});