0

ファイルの読み取りが遅く、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

このコードはpa.parse(inputLine);、入力行を an に送信する行を解析しANTLRStringStream、次に aCharStreamを解析してから解析します。次に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が役に立たないことを知っています... とにかく、改善する必要があるのは、ファイル内の各行の複雑なデコード/解析を行う文法用に構築されたクラス内のパフォーマンスです.

だから私の問題はそれをマルチスレッドにする方法です、

乾杯

4

2 に答える 2

1

各ファイル行が個別の解析可能なエンティティである場合、次のように複数のスレッドを持つことができます。

  • ファイルから行を読み取り、結果をワーカー キューに格納する 1 つのスレッド (ほとんどの場合、メイン スレッド)
  • スレッドのプール。各スレッドは前述のワーカー キューからファイル行を取得し、データを解析します。
  • スレッド間で共有されるファイル行のキューを同期する必要があります

これは、マルチコア CPU で実行した場合にのみパフォーマンスが向上します。

さらに、これは、前述のように、各ファイル行が個別の解析可能なエンティティである場合にのみ機能します。解析可能なエンティティの概念が複数行にわたる場合、またはファイル全体である場合、スレッド化は役に立ちません。さらに、ファイル内の行の順序が重要な場合、行が順不同で解析される可能性があるため、マルチスレッドによって問題が発生する可能性があります。

これは、標準的な生産者/消費者の問題です。役立つリンクを次に示します。

于 2012-06-13T16:58:31.940 に答える
0

入力ファイルをいくつかに単純に分割し、それらを並列スレッドでインポートできるように見えます。

于 2012-06-13T20:44:22.030 に答える