파일을 읽는 데 느린 것을 증명하는 프로그램이 있고 antlr 문법으로 파싱하는 프로그램이 있습니다. 이 성능을 향상시키기 위해 구문 분석 멀티 스레드 싶습니다?Java에서 ANTLR 파서를 멀티 스레드하는 방법
읽기 파일 :
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
코드는 다음과 ANTLRStringStream
CharStream
에 입력 라인을 전송하고 파싱 pa.parse(inputLine);
으로 라인을 파싱한다. 다음 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에서 생성 된 렉서 및 파서 클래스. – xchiltonx
@ALEX : 놀랍습니다. 과장된 이유는 무엇입니까? jTable에 모든 데이터를 저장해야하므로 완벽합니다. TBH 내 정규식은 녹슬고 녹슬지 않아 디코딩의 복잡성으로 인해 올해에는 내가 필요로하는 것을 얻지 못할 것입니다.) ANTLR로 놀라운 속도를 얻으려고 노력하고 있지만, 많은 라인을 페어링하고 있습니다. – xchiltonx