У меня есть моя программа, которая медленно просматривает файл и затем анализирует его с помощью грамматики antlr. Чтобы улучшить производительность этого, я хотел бы многопоточность разбора?Как многопоточный парсер ANTLR в java
чтения файла:
LogParser pa = new LogParser();
LogData logrow;
String inputLine;
int a=0;
try {
//feed line by line
FileReader fr = new FileReader(jFileChooser1.getSelectedFile());
BufferedReader reader = new BufferedReader(fr);
while ((inputLine = reader.readLine()) != null)
{
try {
a++;
jProgressBar.setValue(a);
pa.parse(inputLine); //decode the line
} catch ... catches errors and send to logger
} finally {
logrow=new LogData(pa,a);
mLogTable.addRow(logrow);//store the decoded line
}
}
reader.close();
} catch ... catches errors and send to logger
Код разбирает строку с pa.parse(inputLine);
, который посылает входную линию в к ANTLRStringStream
, а затем CharStream
и затем проанализирован. Далее logrow=new LogData(pa,a);
получает декодированные значения, которые будут сохранены в моей таблице.
В моем профилировании показаны горячие точки, находящиеся в классах лексера и парсера, которые построены из моей грамматики (то есть LogGrammarLexer и LogGrammarParser). Надеюсь, что это достаточно ясно ...
Синтаксический:
LogGrammarLexer lexer = new LogGrammarLexer(inStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
decoded = new LogGrammarParser(tokens);
try {
failurePosition="";
decoded.logLine();
} catch (RecognitionException e) {
failurePosition=Integer.toString(e.charPositionInLine);
} catch (Exception e) {
failurePosition="-3";
throw e;
} finally {
return decoded;//TODO: see if return is necessary as decoded is now a field in class
}
Кроме того, я читал и теперь знаю, что многопоточность файл I/O бесполезно ... Во всяком случае выступления внутри встроенные классы для моей грамматики, которые выполняют сложное декодирование/парсинг каждой строки в моем файле, что мне нужно улучшить.
Так что моя проблема заключается в том, чтобы сделать это многопоточным,
Приветствия
Похоже, что вы разбираете строки из файла журнала, и Antlr кажется излишним для этой задачи.Я хотел бы использовать регулярное выражение или даже разбору его вручную, прежде чем пытаться оптимизировать Antlr или использовать несколько потоков. – Alex
@BART: Как я уже сказал: «Мое профилирование показывает, что горячие точки находятся в классах лексера и парсера, которые построены из моей грамматики», я думаю, я был недостаточно ясен ... шоу горячих точек, например, mToken() в моих ANTLR генерируемых классах lexer и parser. – xchiltonx
@ALEX: ничего себе, это удивительно, почему излишний? это идеально, поскольку мне нужны все данные, которые нужно сохранить в jTable. TBH мое регулярное выражение очень ржавое, и из-за сложности декодирования я бы никогда не получил то, что мне нужно в этом году;) Я получаю потрясающие скорости с ANTLR, но я просто разбираю много строк. – xchiltonx