我们正面临着解析Oracle文件的antlr性能问题。用于转换的oracle文件具有重要的大型17/24/38 mb文件。在构建解析树时,它需要花费大量的时间和内存。它甚至提供核心OOM转储。我们尝试禁用构建解析树,但是这不起作用,因为walker不通过文件并生成空白文件。我们尝试使用BufferedInputStream
代替FileInoutStream
。我们甚至尝试过使用
BufferedTokenStream
,UnbufferedCharStream
,UnbufferedTokenStream
,而不是解析器和词法分析器的其他相应或等效流。这些选项都没有工作,解析树占用了大量内存和时间来生成和遍历。我们尝试使用2 Gigs的堆内存运行,但它超出了这个范围,并提供了核心OOM转储。
在线论坛上,当Antlr尝试解析大型输入文件时,这似乎是一个非常常见的问题。作为替代方案,它或者建议将输入文件分解为多个小文件。它还说我们可以将听众和访问者放在一边,直接在语法中创建对象并使用散列图/向量。
Are there any good examples to references where setBuildParseTree = false? Can ANTLR4 java parser handle very large files or can it stream files Is it possible to parse big file with ANTLR?
您过去是否遇到任何此类Antlr问题,如果是,是如何处理的?任何有助于减少内存占用并使Antlr特定性能更快的建议?
输入文件主要包含choose和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')
;