2017-07-28 31 views
4

我想用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。當我用較小的文件測試這些代碼時,它的效果很好。

有沒有辦法,我失去了一些東西?

我很感激任何幫助。

問候

+0

是否有可能打破大文件成更小的?並將每個較小的一個作爲一個單獨的文件解析到它自己的樹中。希望這不會危及你的業務邏輯。 – smwikipedia

回答

0

嘗試運行標記化,並在一個線程增加堆棧大小分析:

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