私は、バッファを使用してバイトのパターンを検索するときに、ファイルから2回読み込むことなく効率的に作業する方法を見つけようとしています。私はRunnableを実装することを選択したので、タスクを並行スレッドで動作させるために分割することができます。私のコードは次のようになります。Javaのバッファから効率的なパターン検索?
// constructor: initializes local variables.
public BytePatternSearcher(RandomAccessFile raFile, byte[] pattern, int bufferSize, long startPos, long endPos);
public void run()
{
while(amountToRead - raFile.read(buffer) > 0)
{
// search code
}
{
を今、私は暗礁に乗り上げるました:私のアルゴリズムが複雑なもので、簡単な例で動作しますが、ありません。私は、すでに検索されているパターンの中からパターンが始まることはなく、パターンの長さはバッファよりも短く、一度に1スキャンに制限してファイルを反復するだけであると仮定しました。もちろん、これは非常に堅牢なソリューションではありません。私は 'xxxxx'(長さ5)のパターンを持ち、私のファイルは 'xxxxxxyxxxxxx'で、バッファのサイズは2です(xとyは特定のバイト値を表します)。文字列は4回現れ、各チェックにはバッファ長の2倍以上が必要です。
すべてのケースで同じバイトを2回以上チェックせずに作業を行うにはどうすればよいですか?
クヌースモリスプラットアルゴリズムをルックアップする。 – dasblinkenlight
"design-pattern"タグが当てはまるとは思わない –
この時点で複数のスレッドを追加するのは時期尚早の最適化であり、ファイル全体をメモリにロードしようとするとメモリ不足エラーが発生する可能性がありますすぐに。代わりに、シーケンシャルアルゴリズム(BMは良い選択肢です)を使用し、マッチを追跡し、(1)それらをあなたの発見として処理するか、または(2)ファイルを2回読むことを心配しないでください(ブロックの多くOSバッファにある可能性が高い)。 – kdgregory