高容量文件的Antlr4性能问题

高容量文件的Antlr4性能问题,antlr4,high-volume,Antlr4,High Volume,我们在解析Oracle文件时面临antlr性能问题。用于转换的oracle文件具有相当大的17/24/38 mb文件。在构建解析树时,需要花费大量的时间和内存。它甚至会给你一个垃圾堆。我们尝试禁用解析树的构建,但是这不起作用,因为walker不会遍历文件并生成一个空白文件。我们尝试使用BufferedInputStream代替FileInoutStream。我们甚至尝试使用 BufferedTokenStream,UnbufferedCharStream,UnbufferedTokenStrea

我们在解析Oracle文件时面临antlr性能问题。用于转换的oracle文件具有相当大的17/24/38 mb文件。在构建解析树时,需要花费大量的时间和内存。它甚至会给你一个垃圾堆。我们尝试禁用解析树的构建,但是这不起作用,因为walker不会遍历文件并生成一个空白文件。我们尝试使用
BufferedInputStream
代替
FileInoutStream
。我们甚至尝试使用
BufferedTokenStream
UnbufferedCharStream
UnbufferedTokenStream
,而不是解析器和词法器的其他相应或等效流。所有选项都不起作用,并且解析树的生成和遍历占用了大量内存和时间。我们也尝试过使用2 Gig的堆内存运行,但它超出了这一范围,并提供了核心OOM转储

从在线论坛上看,当Antlr试图解析大型输入文件时,这似乎是一个非常常见的问题。作为替代,它建议将输入文件分解为多个小文件。它还说,我们可以撇开侦听器和访问者,直接在语法中创建对象,并使用hashmaps/vectors

您过去是否遇到过此类Antlr问题?如果是,是如何处理的?针对Antlr,有什么建议可以帮助减少内存占用并提高性能

输入文件主要包含selects和insert语句。但是这些文件的容量很大

INSERT INTO crmuser.OBJECT_CONFIG_DETAILS(
ATTRIBCONFIGID,OBJCONFIGID,ATTRIBNAME,PARENTNAME,ISREQUIRED
,ISSELECTED,READACCESS,WRITEACCESS,DEFAULTLABEL,CONFIGLABEL
,DATATYPE,ISCOMPOSITE,ISMANDATORY,ATTRIBSIZE,ATTRIBRANGE
,ATTRIBVALUES,ISWRITABLE)
VALUES ( 
91933804, 1682878, 'ACCOUNTS_EXTBO.RELATIVE_MEMBER_ID', 'ACCOUNTS_EXTBO', 
'N', 'Y', 'F', 'F', 'ACCOUNTS_EXTBO.RELATIVE_MEMBER_ID', 
'ACCOUNTS_EXTBO.RELATIVE_MEMBER_ID', 'String', 'N', 'N', 50, 
null, null, 'N')
;

INSERT INTO crmuser.OBJECT_CONFIG_DETAILS(
ATTRIBCONFIGID,OBJCONFIGID,ATTRIBNAME,PARENTNAME,ISREQUIRED
,ISSELECTED,READACCESS,WRITEACCESS,DEFAULTLABEL,CONFIGLABEL
,DATATYPE,ISCOMPOSITE,ISMANDATORY,ATTRIBSIZE,ATTRIBRANGE
,ATTRIBVALUES,ISWRITABLE)
VALUES ( 
91933805, 1682878, 'ACCOUNTS_EXTBO.ELIGIBILITY_CRITERIA', 'ACCOUNTS_EXTBO', 
'N', 'Y', 'F', 'F', 'ACCOUNTS_EXTBO.ELIGIBILITY_CRITERIA', 
'ACCOUNTS_EXTBO.ELIGIBILITY_CRITERIA', 'String', 'N', 'N', 50, 
null, null, 'N')
;

我遇到了同样的问题。我试图考虑一种方法来自动将我的大文件分解成“子任务”。通常,当我到达文件中的某一点时,我会查看单个ASCII记录,这些记录都解析为规则的子集。我可以在每个记录的末尾刷新解析树。我在翻译数据。我试图避免将侦听器函数移回语法中。