2

ドキュメント内のパターンを検索するために使用する文字列の大きな(200Kを超える)配列があります。配列内の各エントリを正規表現に変換してから、ドキュメントに適用します。これを行うと、配列を調べて検索を順番に実行するのにかかる時間が劇的に長くなります。これは、検索を実行する前に各正規表現に順番に適用するPattern.compileステートメントに対して行われると思います。正規表現を事前にコンパイルすることはこれを回避する方法かもしれませんが、これを行うとメモリ使用量が劇的に増加することに気づきました。プリコンパイルする前に、Javaアプリケーションは約1.5ギガバイトのサイズのVMで実行されます。プリコンパイル後、Javaプログラムは約14ギガのサイズのVMで実行されます。

この問題を回避したり、プログラムをより効率的に実行したりするためのエレガントな方法はありますか?

ありがとうございました、

エリオット

4

1 に答える 1

0

すべての正規表現をメモリにコンパイルしたままにするのは避け、使用する前に1つずつコンパイルし、ガベージコレクタが使用済みの正規表現をクリーンアップできることを確認します。これにより、ピークメモリ使用量が低下する可能性があります。

また、理論的には、キャプチャグループや演算子(|)を使用して、多くの正規表現を1つの正規表現にマージし、1回のパスでドキュメントをスキャンして、最後に一致する呼び出し元のgroup()を確認することもできます。

これには、コンパイル段階で異なる正規表現の同様の部分を統合するという利点もあります。

これは、アイデアを説明するためだけに、ドキュメント全体を照合し、検索や置換を行わないことを前提とした単純な例です。

String patternA = "patternA";
String patternB = "patternB";
Pattern compiled = Pattern.compile(String.format("(%s)|(%s)",patternA, patternB))
Matcher matcher = compiled.matcher(input);
if (matcher.matches()) {
  if (matcher.group(1)) {
    // patternA matched
  }
  if (matcher.group(2)) {
    // patternB matched
  }
}
于 2012-12-30T21:59:11.663 に答える