Java在读取文件但同时使用流时避免Java.lang.OutOfMemoryError

Java在读取文件但同时使用流时避免Java.lang.OutOfMemoryError,java,file,parallel-processing,stream,filereader,Java,File,Parallel Processing,Stream,Filereader,我试图读取一个非常大的文件流,所以我需要并行流,而不是每行迭代。。。我的尝试如下: String cont = new String(Files.readAllBytes(Paths.get(this.File_Path)), StandardCharsets.UTF_8); List<String> words = Arrays.asList(cont.split("\\PL+")); yep = words.parallelStream()

我试图读取一个非常大的文件流,所以我需要并行流,而不是每行迭代。。。我的尝试如下:

String cont = new String(Files.readAllBytes(Paths.get(this.File_Path)),
            StandardCharsets.UTF_8);    
List<String> words = Arrays.asList(cont.split("\\PL+"));

yep = words.parallelStream()
            .filter(x -> x.contains(toMatch))
            .distinct()
            .collect(Collectors.toList());

有一种方法可以避免此异常,但同时使用并行流,而不是使用BufferReader或Scanner进行迭代?

java堆内存有限。我们不能同时读取文件的全部数据。超过一定的大小是不可能的(除非您增加堆内存,因为某些原因堆内存并不理想)。我的建议是,将文件分成几行,固定大小为1000行。然后运行拆分为数组并计算该块的操作。

您可以通过多线程并行化块。

问题在于
文件。readAllBytes()
。它以
字符串
的形式加载文件的全部内容,因此在内存中。
要逐行读取,您需要使用
文件.lines()
返回
,然后将其转换为并行流并对其执行转换操作:

List<String> words = 
    Files.lines(Paths.get(this.File_Path), charSetOfYourFileIfNotUTF8) // Stream<String>
         .parallel()
         .flatMap(s-> Arrays.stream(s.split("\\PL+"))) // Stream<String>
         .filter(x -> x.contains(toMatch))
         .distinct()
         .collect(Collectors.toList());
列出单词=
Files.line(Path.get(this.File\u Path),charSetOfYourFileIfNotUTF8)//流
.parallel()
.flatMap(s->Arrays.stream(s.split(\\PL+)))//stream
.filter(x->x.contains(toMatch))
.distinct()
.collect(Collectors.toList());
关于性能,请注意并行管道中的
distinct()

你应该考虑<代码> ToSET(),以进一步提高性能。 是行
cont.split(\\PL+)上的错误
?我已经尝试过这个方法,但使用Files.lines会给我另一个异常:java.io.UncheckedIOException:java.nio.charset.MalformedInputException:Input length=1。我也尝试过传递Files.lines StandardCharsets.UTF_8,但文件字符集和默认字符集之间可能没有字符集不匹配。尝试将UTF-8显式设置为编辑中的设置。无论您应该使用什么,都可以使用兼容的字符集来防止此问题。我还添加了上面修改过的字符集,但这不是问题所在。将字符集更改为StandardCharsets.ISO_8859_1现在也可以使用。这意味着您的文件不是UTF-8格式,而是ISO_8859_1格式。
List<String> words = 
    Files.lines(Paths.get(this.File_Path), charSetOfYourFileIfNotUTF8) // Stream<String>
         .parallel()
         .flatMap(s-> Arrays.stream(s.split("\\PL+"))) // Stream<String>
         .filter(x -> x.contains(toMatch))
         .distinct()
         .collect(Collectors.toList());