如何在解析C#中的Antlr4大文件时解决OutOfMemoryException?
问题描述:
我想用Ant#4解析一个大文件(大约500MB)使用c#。但是我有一个OutOfMemoryException。下面如何在解析C#中的Antlr4大文件时解决OutOfMemoryException?
我当前的代码描述:
var path = GetInput(Path.Combine(DatFilePath)); // Build the large file
var inputStream = new StreamReader(path);
var input = new UnbufferedCharStream(inputStream);
GroupGrammarLexer lexer = new GroupGrammarLexer(input);
lexer.TokenFactory = new CommonTokenFactory(true);
var tokens = new UnbufferedTokenStream(lexer);
GroupGrammarParser parser = new GroupGrammarParser(tokens);
parser.BuildParseTree = false;
GroupGrammarParser.FileContext tree = parser.file(); // here I get OutOfMemoryException
我的语法:
语法GroupGrammar;
/*
* Parser Rules
*/
file: row+;
row: group | comment | not;
group: GROUP NAME ATTACHTO NAME;
comment: '**' .*? NL;
not: .*? NL;
GROUP : '*'? G R O U P ;
ATTACHTO : '*'? A T T A C H T O ;
W : ('W'|'w') ;
E : ('E'|'e') ;
L : ('L'|'l') ;
G : ('G'|'g') ;
R : ('R'|'r') ;
O : ('O'|'o') ;
U : ('U'|'u') ;
P : ('P'|'p') ;
A : ('A'|'a') ;
T : ('T'|'t') ;
C : ('C'|'c') ;
H : ('H'|'h') ;
NAME : '\''[a-zA-Z0-9_]+'\'' ;
WS: (' ') -> skip;
NL: '\r'? '\n';
我对所有有关大文件的建议做过修改,但我仍然遇到OutOfMemoryException。当我用较小的文件测试这些代码时,它的效果很好。
有没有办法,我失去了一些东西?
我很感激任何帮助。
问候
答
尝试运行标记化,并在一个线程增加堆栈大小分析:
Thread thread = new Thread(delegate()
{
// Tokenize and parse here
},
500000);
thread.Start();
是否有可能打破大文件成更小的?并将每个较小的一个作为一个单独的文件解析到它自己的树中。希望这不会危及你的业务逻辑。 – smwikipedia