4

ローカル マシンからテキスト ファイルを解析する必要があるという問題があります。いくつかの複雑な問題があります。

  1. ファイルは非常に大きくなる可能性があります (700 MB 以上)
  2. パターンは複数の行で発生します
  3. パターンの後に店舗の行情報が必要です

BufferReaderString.indexOfおよびString.substring(項目3を取得するため)を使用して簡単なコードを作成しました。

code=ファイル内には、異なるブロックで何度も発生するという名前のキー (パターン) があります。プログラムは、 を使用してこのファイルから各行を読み取りますBufferReader.readLine。パターンが表示されるかどうかを確認するために使用indexOfし、パターンの後にテキストを抽出して共通の文字列に保存します。

600MB のファイルでプログラムを実行すると、ファイルの処理中にパフォーマンスが最悪になることに気付きました。CodeRanch で、Scannerクラスが大きなファイルに対してパフォーマンスを発揮しないという記事を読みました。

パフォーマンスを向上させるテクニックやライブラリはありますか?

前もって感謝します。

ここに私のソースコードがあります:

String codeC = "code=[";
String source = "";
try {
    FileInputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
    DataInputStream in = new DataInputStream(f1);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String strLine;
    boolean bPrnt = false;
    int ln = 0;
    // Read File Line By Line
    while ((strLine = br.readLine()) != null) {
        // Print the content on the console
        if (strLine.indexOf(codeC) != -1) {
            ln++;
            System.out.println(strLine + " ---- register : " + ln);
            strLine = strLine.substring(codeC.length(), strLine.length());
            source = source + "\n" + strLine;
        }
    }
    System.out.println("");
    System.out.println("Lines :" + ln);
    f1.close();
} catch ( ... ) {
    ...
}
4

4 に答える 4

2

このコードは非常に疑わしく、パフォーマンスの問題の少なくとも一部を説明している可能性があります。

FileInputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
DataInputStream in = new DataInputStream(f1);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

DataInputStreamあなたは正当な理由もなく関与しており、実際にそれをへの入力として使用することReaderは、コードが壊れていると見なすことができます。代わりにこれを書いてください:

InputStream f1 = new FileInputStream("c:\\Temp\\fo1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fr));

System.out特に Eclipse で実行しているときにパフォーマンスを測定する場合、コマンド ラインから実行している場合でも、パフォーマンスに大きな悪影響を及ぼします。私の推測では、これがボトルネックの主な原因です。最高のパフォーマンスを目指すときは、必ずメインループで何も出力しないようにしてください。

于 2012-11-29T19:27:22.000 に答える
1

マルコが答えたことに加えて、f1ではなくbrを閉じることをお勧めします。

br.close()

これはパフォーマンスには影響しませんが、よりクリーンになります。(最も外側のストリームを閉じる)

于 2012-11-29T19:34:33.753 に答える
0

java.util.regexを見てください

オラクルの優れたチュートリアル。

JAVADoc からのコピー ペースト:

正規表現で指定されたパターンに対して文字シーケンスを照合するためのクラス。

Pattern クラスのインスタンスは、Perl で使用されるものと同様の構文で文字列形式で指定される正規表現を表します。

Matcher クラスのインスタンスは、特定のパターンに対して文字シーケンスを照合するために使用されます。さまざまな入力ソースからの文字との照合をサポートするために、入力は CharSequence インターフェイスを介してマッチャーに提供されます。

特に明記されていない限り、このパッケージの任意のクラスまたはインターフェイスのメソッドに null 引数を渡すと、NullPointerException がスローされます。

于 2012-11-29T19:12:43.010 に答える
0

それは完璧に動作します!!

OldCurmudgeon 、Marko Topolnik AlexWienアドバイスに従い、パフォーマンスが 1000% 向上しました。プログラムが記述された操作を完了し、応答をファイルに書き込むのに 2 時間を費やす前。今では5分かかります!! そしてSYSOはソースコードのまま!!

大きな改善の理由は、OldCurmudgeon が示唆するように HashSet "source" の文字列 "source" を変更したことだと思います。Bur DataInputStream を削除し、「br.close」も使用しました。

みんなありがとう !!

于 2012-11-29T20:29:15.407 に答える