【问题标题】:How solve OutOfMemoryException when parsing large files with Antlr4 in c#?在c#中使用Antlr4解析大文件时如何解决OutOfMemoryException?
【发布时间】:2018-01-04 22:35:56
【问题描述】:

我正在尝试使用 c# 使用 Antlr4 解析一个大文件(大约 500MB)。但我遇到了 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

我的语法:

语法组语法;

/*
 * 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。当我用较小的文件测试这段代码时,它工作得很好。

我有什么遗漏的吗?

感谢您的帮助。

最好的问候

【问题讨论】:

  • 是否可以将大文件分成较小的文件?并将每个较小的文件作为一个单独的文件解析到它自己的树中。希望这不会危及您的业务逻辑。

标签: c# parsing antlr4 large-files


【解决方案1】:

尝试在堆栈大小增加的线程中运行标记化和解析:

Thread thread = new Thread(delegate ()
{
    // Tokenize and parse here
},
500000);
thread.Start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 2021-05-29
    • 1970-01-01
    • 2014-12-10
    • 2015-07-19
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多