2012-06-13 3 views
0

파일을 읽는 데 느린 것을 증명하는 프로그램이 있고 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 

코드는 다음과 ANTLRStringStreamCharStream에 입력 라인을 전송하고 파싱 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가 쓸모없는 파일 ... 가 어쨌든 그것은 내부의 공연 것을 알고있다 내 문법에 대해 작성된 클래스로 복잡한 파일을 디코딩하는 것/개선 할 필요가있는 파일의 각 줄을 파싱하는 것.

그래서 내 문제는 각 파일 라인은 별도의 구문 분석-수 엔티티 인 경우 다음과 같이 여러 개의 스레드를 가질 수 있습니다, 그것은 다중 스레드 만들

건배

+0

로그 파일에서 줄을 파싱하는 것처럼 보입니다. Antlr은 그 작업에 과도한 것처럼 보입니다.Antlr을 최적화하거나 여러 스레드를 사용하려고 시도하기 전에 정규식을 사용하거나 직접 파싱하는 방법을 살펴볼 것입니다. – Alex

+0

@BART : 이미 말했듯이 "필자의 프로파일 링은 핫 스폿이 내 문법으로 작성된 렉서 및 파서 클래스에 있음을 보여줍니다"라고 말한 것처럼 충분히 명확하지 않은 것 같습니다 ... 핫스팟은 예를 들어 mToken() 내 ANTLR에서 생성 된 렉서 및 파서 클래스. – xchiltonx

+0

@ALEX : 놀랍습니다. 과장된 이유는 무엇입니까? jTable에 모든 데이터를 저장해야하므로 완벽합니다. TBH 내 정규식은 녹슬고 녹슬지 않아 디코딩의 복잡성으로 인해 올해에는 내가 필요로하는 것을 얻지 못할 것입니다.) ANTLR로 놀라운 속도를 얻으려고 노력하고 있지만, 많은 라인을 페어링하고 있습니다. – xchiltonx

답변

1

하는 방법입니다 :

  • 파일에서 행을 읽고 그 결과를 작업자 큐에 저장하는 하나의 스레드 (주로 주 스레드)
  • 각 스레드는 이전에 언급 한 작업자 큐에서 파일 행을 가져옵니다 및 멀티 코어 CPU에서 실행되는 경우에만 성능의 증가를 볼 수

이을 동기화해야합니다 데이터

  • 스레드간에 공유 파일 라인의 큐를 구문 분석합니다.

    또한 각 파일 행이 앞서 언급 한 별도의 구문 분석 가능 엔터티 인 경우에만 작동합니다. 파싱 ​​할 수있는 엔티티의 개념이 여러 줄에 걸쳐 있거나 전체 파일이라면 스레딩은 도움이되지 않습니다. 또한 파일의 행 순서가 중요한 경우 멀티 스레딩이 문제를 일으킬 수 있습니다. 행이 순서가 잘못 파싱 될 수 있기 때문입니다.

    이 표준 생산자/소비자 문제, 여기에 몇 가지 유용한 링크가 있습니다 : 당신은 단순히으로 입력 파일을 분할 할 수처럼

  • +0

    네,이게 딱 맞는 것 같아요. 예를 찾으려고했는데, 스윙을 사용하고 있습니다. 그래서 SwingWorker가 될 필요가 있다고 생각합니다. ??? 하지만 내가 필요로하는 코드를 파악할 수는 없습니까? – xchiltonx

    +0

    @xchiltonx, SwingWorker에 대한 확신이 없습니다. GUI 개념이기 때문에 GUI 작업이 아닙니다. 이것은 표준 생산자/소비자 문제입니다. 몇 가지 예를 살펴보고 답변을 업데이트하겠습니다. – Brady

    +0

    죄송합니다. 답장을 보내지는 못했지만 감사합니다. 너는 별이야! – xchiltonx

    0

    가 보이는 여러 개를 병렬 스레드로 가져 왔습니다.

    관련 문제