非常に大きなテキストファイルがあると想像してください。パフォーマンスは本当に重要です。
私がしたいのは、特定の文字列を探すためにそれをスキャンすることです。たぶん私はそれらの数を数えたいのですが、それは本当に重要ではありません。
重要なのは、最速の方法は何ですか?
私はそれが速くなければならない維持を気にしません。
速いことが重要です。
非常に大きなテキストファイルがあると想像してください。パフォーマンスは本当に重要です。
私がしたいのは、特定の文字列を探すためにそれをスキャンすることです。たぶん私はそれらの数を数えたいのですが、それは本当に重要ではありません。
重要なのは、最速の方法は何ですか?
私はそれが速くなければならない維持を気にしません。
速いことが重要です。
1回限りの検索には、ここで提案されているように、スキャナーを使用します
indexOf()よりもかなり高速な簡単な手法は、findWithinHorizon()メソッドを使用してScannerを使用することです。Fileオブジェクトを受け取るコンストラクターを使用する場合、Scannerはファイルを読み取るために内部的にFileChannelを作成します。また、パターンマッチングでは、効率的な文字列検索のためにボイヤームーアアルゴリズムを使用することになります。
まずFileChannel
、クラスではなくnio()を使用しjava.io
ます。次に、Boyer-Mooreのような効率的な文字列検索アルゴリズムを使用します。
同じファイルで異なる文字列を複数回検索する必要がある場合は、ある種のインデックスを作成する必要があるため、Luceneを参照してください。
ファイル全体をメモリにロードしてから、 KnuthMorrisPrattなどの文字列検索アルゴリズムの使用を確認します。
編集:
簡単なグーグルは、いくつかの異なる文字列検索アルゴリズムを実装しているように見えるこの文字列検索ライブラリを示しています。私はそれを使ったことがないので、それを保証することはできません。
これがばかげた提案かどうかはわかりませんが、grepはかなり効率的なファイル検索ツールではありませんか?多分あなたはそれを使用して呼び出すことができますRuntime.getRuntime().exec(..)
詳細が何であれ、通常はメモリマップドIOが答えです。
編集:要件に応じて、ファイルをSQLデータベースにインポートしてから、JDBCを介したパフォーマンスの向上を活用してみてください。
Edit2: JavaRanchのこのスレッドには、FileChannelを含む他のアイデアがいくつかあります。まさにあなたが探しているものかもしれないと思います。
取得できる最速の方法は、FileInputStreamsの上にBufferedInputStreamsを使用することです...または、BufferedInputStreamのインスタンス化を回避したい場合は、カスタムバッファーを使用します。
これは私よりもよく説明します:http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/
適切なツールを使用する:全文検索ライブラリ
私の提案は、メモリ内インデックス(またはキャッシュが有効になっているファイルベースのインデックス)を実行してから、そのインデックスで検索を実行することです。@Michael Borgwardtが示唆したように、Luceneはそこにある最高のライブラリです。
これは、ファイルごとに複数の検索を実行する必要があるかどうかによって異なります。1回だけ検索する必要がある場合は、ディスクからファイルを読み込み、MichaelBogwartが提案したツールを使用して解析します。複数の検索を行う必要がある場合は、Luceneなどのツールを使用してファイルのインデックスを作成する必要があります。ファイルを読み込んでトークン化し、トークンをインデックスに貼り付けます。インデックスが十分に小さい場合は、RAMに入れてください(LuceneはRAMまたはディスクバックアップインデックスのオプションを提供します)。そうでない場合はディスクに保管してください。また、RAMに対して大きすぎて、速度について非常に非常に心配している場合は、インデックスをソリッドステート/フラッシュドライブに保存してください。