2017-07-28 1 views
4

J'essaye d'analyser un gros fichier (environ 500 Mo) avec Antlr4 en utilisant C#. Mais j'ai une exception OutOfMemoryException.Comment résoudre OutOfMemoryException lors de l'analyse de fichiers volumineux avec Antlr4 dans C#?

Mon code actuel est décrit ci-dessous:

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 

Ma grammaire:

grammaire 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'; 

J'ai jeté tous les conseils sur les fichiers volumineux, mais je reçois toujours l'exception OutOfMemoryException. Lorsque je teste ce code avec un fichier plus petit, cela fonctionne très bien.

Y at-il quelque chose qui me manque?

J'apprécie pour toute aide.

Cordialement

+0

Est-il possible de briser le gros fichier en plus petits? Et analyser chaque plus petit en tant que fichier séparé dans son propre arbre. J'espère que cela ne mettra pas en péril la logique de votre entreprise. – smwikipedia

Répondre

0

Essayez d'exécuter tokenization et l'analyse syntaxique dans un fil avec augmentation de la taille de la pile:

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