我们在解析 Oracle 文件时面临 antlr 性能问题。用于转换的 oracle 文件具有相当大的 17/24/38 mb 文件。在构建解析树时,它需要大量的时间和内存。它甚至提供核心 OOM 转储。我们尝试禁用解析树的构建,但这不起作用,因为 walker 不会通过文件并生成一个空白文件。我们尝试 使用BufferedInputStream
. FileInoutStream
我们甚至尝试使用
BufferedTokenStream
, UnbufferedCharStream
, UnbufferedTokenStream
, 而不是解析器和词法分析器的其他相应或等效流。这些选项都不起作用,并且解析树需要大量的内存和时间来生成和遍历。我们也尝试使用 2 Gigs 的堆内存运行,但是它超出了这个范围并提供了核心 OOM 转储。
从在线论坛看来,当 Antlr 尝试解析大型输入文件时,这似乎是一个非常常见的问题。作为替代方案,它建议将输入文件分解为多个小文件。它还说我们可以将听众和访问者放在一边,直接在语法中创建对象并使用哈希图/向量。
setBuildParseTree = false 的引用有什么好的例子吗? ANTLR4 java解析器可以处理非常大的文件还是可以流式传输文件 可以用ANTLR解析大文件吗?
您过去是否遇到过任何此类 Antlr 问题,如果是,是如何处理的?有什么建议可以帮助减少内存占用并使 Antlr 的性能更快吗?
输入文件主要包含选择和插入语句。但这些文件体积很大。
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')
;