Parsing ANTLR-如何丢弃(释放)令牌,以便能够解析大型文件

Parsing ANTLR-如何丢弃(释放)令牌,以便能够解析大型文件,parsing,memory,token,antlr4,Parsing,Memory,Token,Antlr4,我正试图用ANTLR解析大文件(200MB),我遇到了serios内存问题。是否有可能释放一些收集到的令牌,使我能够解析大型文件?我只对解析(对于语法检查器)感兴趣,我并不真正需要令牌,但我怀疑它们是内存消费者。有一种称为setBuildParseTree的解析器方法,它跳过构建上下文等 Parser tp = new <ConcreteLanguageParser>(tokenstream); tp.setBuildParseTree(false); Parser tp=new(

我正试图用ANTLR解析大文件(200MB),我遇到了serios内存问题。是否有可能释放一些收集到的令牌,使我能够解析大型文件?我只对解析(对于语法检查器)感兴趣,我并不真正需要令牌,但我怀疑它们是内存消费者。

有一种称为setBuildParseTree的解析器方法,它跳过构建上下文等

Parser tp = new <ConcreteLanguageParser>(tokenstream);
tp.setBuildParseTree(false);
Parser tp=new(令牌流);
tp.setBuildParseTree(false);
这将减少消费

此外,还有一种鹿角叉,其内存使用率较低:

已调用,但解析器仍会累积太多内存。如果setBuildParseTree(true),则内存更大。@verbessern您可以将输入划分为与语法中的子规则相对应的块,然后分别分析每个块,除了每次分析后所需的内容外,其余都扔掉。你可以做一些语法优化,但是如果看不到语法,就很难说了。ANTLR使用标记结构维护文本的副本。考虑定义一个自定义令牌流,该令牌流丢弃令牌的文本,因为这不是用于解析的唯一标记类型。如果不查看语法和输入,很难说这是否会节省大量内存。您可能还想看看TokenFactory和Lexer.setTokenFactory。它将允许在没有实际文本值的情况下发出标记,如@kaby76suggested@kaby76我不太想开发定制的解决方案,这些解决方案必须为该工具的每个未来版本进行维护。我希望有现成的解决方案/选项。即使我像你说的那样释放令牌中的文本(我必须尝试),它仍然会将令牌保留在内存中,并包含所有相关指针和相关内存碎片。基本上,我的内存仍在增长,即使我根本不需要令牌。@siggemannen感谢您提供了指向实际类名的指针。