Oracle ファイルを解析するための antlr のパフォーマンスの問題に直面しています。変換用の oracle ファイルには、17/24/38 mb の非常に大きなサイズのファイルがあります。構文解析木を構築する間、多くの時間とメモリを消費します。コア OOM ダンプも提供します。解析ツリーの構築を無効にしようとしましたが、ウォーカーがファイルを通過せず、空のファイルが生成されるため、機能しません。BufferedInputStream
の代わりに使ってみました FileInoutStream
。パーサーとレクサーの他のそれぞれまたは同等のストリームの代わりに、、、BufferedTokenStream
を UnbufferedCharStream
使用 しようとさえしました
。UnbufferedTokenStream
どのオプションも機能しておらず、解析ツリーの生成と走査に多くのメモリと時間がかかっています。2 ギガのヒープ メモリでも実行してみましたが、それを超えるとコア OOM ダンプが発生します。
オンライン フォーラムによると、Antlr が大きな入力ファイルを解析しようとすると、これは非常に一般的な問題のようです。別の方法として、入力ファイルを複数の小さなファイルに分割することを提案します。また、リスナーとビジターを脇に置いて、文法で直接オブジェクトを作成し、ハッシュマップ/ベクトルを使用できるとも述べています。
setBuildParseTree = false を参照する良い例はありますか? ANTLR4 Java パーサーは非常に大きなファイルを処理できますか、またはファイルをストリーミングできます か? ANTLR で大きなファイルを解析することは可能ですか?
過去にそのような Antlr の問題に遭遇したことがありますか? はいの場合、どのように処理されましたか? メモリ フットプリントを削減し、Antlr 固有のパフォーマンスを高速化するのに役立つ提案はありますか?
入力ファイルにはほとんどの場合、select ステートメントと 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')
;