在内存中保留一个大字符串

时间:2017-04-01 14:57:16

标签: java apache-camel

我有以下java代码:

Path path = Paths.get("largefile.txt2");
if (Files.exists(path))
   exchange.getIn().setBody(Files.lines(path, Charset.forName("UTF-8")).map(row -> row + System.lineSeparator()).collect(Collectors.joining()).trim()); 
//OOM error!

我基本上需要读取内存中的整个文件,根据一些搜索标准进行各种正则表达式处理和拆分。这些文件可以大到300 MB - 1GB大。

我遇到的问题是,这适用于大约100 MB的文件但是一旦达到200或更多,我就会在与堆大小相关的.setBody(..)内出现内存错误。

是否有更高效,特别是内存消耗更少的方法?记忆对我来说比速度更重要。或者我是否需要重新考虑我的整个方法并逐个阅读?

1 个答案:

答案 0 :(得分:1)

这可能没有多大帮助,也许让你使用更大的文件。您正在使用以下内容创建更多字符串:

最后

row + System.lineSeparator().trim()。通过将代码更改为:

,您可以使用更少的内存
exchange.getIn().setBody(Files.lines(path, Charset.forName("UTF-8")).collect(Collectors.joining(System.lineSeparator())); 

虽然我不太明白你为什么要逐行读取文件,然后再用行分隔符连接这些行。

另外,要使用正则表达式处理大型文件,使用Scanner类并使用扫描程序的findWithinHorizon方法可以根据需要使用足够大的范围。当检索到匹配时,扫描仪将自动前进。

相关问题