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

标签 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(..) 处出现内存不足错误。

有没有更高效、尤其是内存消耗更少的方法?对我来说,内存比速度更重要。或者我是否需要重新思考我的整个方法并逐段阅读?

最佳答案

这可能不会有太大帮助,也许可以让您处理更大的文件。通过使用以下内容,您将创建比所需更多的字符串:

row + System.lineSeparator().trim() 位于末尾。您可以通过将代码稍微更改为以下方式来使用更少的内存:

exchange.getIn().setBody(Files.lines(path, Charset.forName("UTF-8")).collect(Collectors.joining(System.lineSeparator())); 

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

此外,要使用正则表达式处理大文件,使用 Scanner 类并使用 Scanner 的 findWithinHorizo​​n 方法(具有足够大的范围来满足您的需求)可能很有用。当检索到匹配项时,扫描仪将自动前进。

关于java - 在内存中保留一个大字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43158353/

相关文章:

java - 除非整个盒子都填满,否则不要进入下一个 Activity

java - spring-ws jdom错误响应

java - Java中准确检测socket发送失败

java - Real Time Java 如何避免优先级倒置

java - 无法验证 XML

java - Camel ......评估一个java表达式

logging - 如何检测 Apache Camel 中的网络断开连接?

java - 如何对建议的 Java 语言功能提供反馈?

singleton - Websphere 集群中的集群范围的单例

java - 路由 Camel cron 表达式