ユーザーが一連の単語を入力すると、システムが 300 万を超えるテキスト ファイルをスキャンし、それらのキーワードを含むファイルを見つけるという単純な要件があります。複雑な検索/インデックス作成アルゴリズムなしでこれを実装する最も効率的で簡単な方法は何でしょうか?
これにはクラスを使用することを考えScanner
ましたが、そのような大きなファイルのパフォーマンスについてはわかりません。パフォーマンスの優先度はそれほど高くありませんが、許容できる水準にあるはずです。
grep へのシステム コールをラップしてみませんか? これは、Runtime クラスを介して実現できます。
各テキスト ファイルを解析するときは、テキストの各行を使用BufferedReader
して一致をチェックします。
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
// Does this line containe the text?
if(line.contains(text)) {
System.out.println("Text found");
}
}
br.close();
このような膨大な数のファイルに対してこれが非常に高速になるかどうかはわかりません。
複雑な検索/インデックス作成アルゴリズムなしでこれを実装する最も効率的で簡単な方法は何でしょうか?
複雑な検索/索引付けアルゴリズム。ここで車輪を再発明する必要はありません。ユーザーは任意の単語を入力できるため、単純な前処理手順を作成することはできず、テキスト内のすべての単語のインデックスを作成する必要があります。これは、Lucene のようなものがあなたのために行うことです。
テキストを前処理してインデックスを作成する以外に、テキストをすばやく検索する方法はありません。これには独自のソリューションを展開することも、単に Lucene を使用することもできます。
前処理のない単純なテキスト検索は、遅すぎて役に立たないでしょう。
What would be the most efficient and simple way to implement this without a complex searching / indexing algorithm
インデックス作成アルゴリズムをまったく使用しない場合は、検索を送信するたびに、すべてのファイルを読み取る必要があります。そうすることによるオーバーヘッドは、「マッチング」アルゴリズムではなく、I/O レイテンシにあります。したがって、マッチングに何を使用するかはあまり気にしません。Scanner
は単純な選択です。
パフォーマンスを向上させたい場合は、何らかの前処理を使用する必要があります。サイズが許せば、ファイルをメモリにロードできます。ファイル (インデックス) ごとに一連の単語を作成できます。特にMap/Reduceコンテキストの「ワードカウント」の例として、検索するにはアルゴリズムが多すぎます。Fork/Join
より高い同時実行性を実現したい場合は、Java のフレームワークを調べることもできます。