我有以下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 的 findWithinHorizon
方法(具有足够大的范围来满足您的需求)可能很有用。当检索到匹配项时,扫描仪将自动前进。
关于java - 在内存中保留一个大字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43158353/