2012-06-13 1 views
0

У меня есть моя программа, которая медленно просматривает файл и затем анализирует его с помощью грамматики 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 бесполезно ... Во всяком случае выступления внутри встроенные классы для моей грамматики, которые выполняют сложное декодирование/парсинг каждой строки в моем файле, что мне нужно улучшить.

Так что моя проблема заключается в том, чтобы сделать это многопоточным,

Приветствия

+0

Похоже, что вы разбираете строки из файла журнала, и Antlr кажется излишним для этой задачи.Я хотел бы использовать регулярное выражение или даже разбору его вручную, прежде чем пытаться оптимизировать Antlr или использовать несколько потоков. – Alex

+0

@BART: Как я уже сказал: «Мое профилирование показывает, что горячие точки находятся в классах лексера и парсера, которые построены из моей грамматики», я думаю, я был недостаточно ясен ... шоу горячих точек, например, mToken() в моих ANTLR генерируемых классах lexer и parser. – xchiltonx

+0

@ALEX: ничего себе, это удивительно, почему излишний? это идеально, поскольку мне нужны все данные, которые нужно сохранить в jTable. TBH мое регулярное выражение очень ржавое, и из-за сложности декодирования я бы никогда не получил то, что мне нужно в этом году;) Я получаю потрясающие скорости с ANTLR, но я просто разбираю много строк. – xchiltonx

ответ

1

Если каждая строка файл представляет собой отдельный разбор в состоянии объекта, то вы можете иметь несколько потоков следующим образом:

  • Один поток (скорее всего, основной поток), который читает строки из файла и сохраняет результат в рабочей очереди
  • пул потоков, каждый из которых будет вытаскивать строку файла из упомянутой выше рабочей очереди и анализировать данные
  • очередь из строк файла разделяемых между нитями должны быть синхронизированы

Это будет видеть только увеличение производительности при запуске на многоядерных процессоров с.

Кроме того, это будет работать только в том случае, если каждая строка файла представляет собой отдельный обрабатываемый сеансом объект, как упоминалось ранее. Если понятие анализируемого объекта охватывает несколько строк, или это весь файл, то нить не поможет. Кроме того, если порядок строк в файле важен, то многопоточность может вызвать проблемы, так как строки могут быть разобраны не в порядке.

Это стандартная проблема производитель/потребитель, вот некоторые полезные ссылки:

+0

Да, это похоже на правильную вещь, я пытался найти пример, я использую качели, поэтому я думаю, что это может быть SwingWorker ??? Но я не могу понять наш код, который мне нужен, не могли бы вы помочь? – xchiltonx

+0

@xchiltonx, я не очень уверен в SwingWorker, поскольку это концепция графического интерфейса и работа, которую вы выполняете, не является задачей GUI. Это стандартная проблема производителя/потребителя. Я буду искать примеры и обновить ответ. – Brady

+0

Извините, я не мог ответить, но спасибо. Ты звезда! – xchiltonx

0

Похоже, вы могли бы просто разделить входной файл на несколько и импортировать их в параллельные потоки.

 Смежные вопросы

  • Нет связанных вопросов^_^