ホw何度もあなたは「検索」をしたい、あなたは検索エンジンを使いたいかどうか。多くの時間を検索する場合は、検索エンジンを使用します。ここでは両方のシナリオを実装する方法について説明します。
検索エンジンを使用している場合:部分文字列を検索しているように聞こえます。好きな検索エンジンを使用してファイルを索引付けする必要があります(できればカスタマイズできるもの(lucene、terrierなど))。ここで必要とする技法は、トリグラムを索引付けすることです。つまり、すべての3文字の組み合わせを索引付けする必要があります。 F.ex .: 'foobar'は 'foo'、 'oob'、 'oba'、 'bar'を生成します。検索するとき、あなたは同じことをあなたの質問とし、これらのすべてのトライグラムのANDで検索エンジンの質問を出したいと思っています。 (これは、投稿リストにマージジョインを実行します。そのマージジョインは、自分のIDや投稿リストに入れたものを返します)。
また、接尾辞配列を実装して、ファイルのインデックスを作成することもできます。短い(1〜2文字)の部分文字列を検索する場合は、これにより少し柔軟になりますが、インデックスに関しては維持するのが難しくなります。 (CWI/Amsterdamでの高速索引接尾辞配列の研究があります)
使用するアルゴリズムはBoyer-Mooreです(私は通常Boyer-moore-sundayを使用しています[Graham A. Stephen、String Search])またはコンパイルされたDFA(作成が簡単なNFAからそれらを構築できます)。しかし、それはディスクIOがおそらくボトルネックであり、とにかくデコードするのに必要なバイト数を比較するという単純な理由から、スピードが少ししか上がらないだけです。
ファイルを行単位で読むのではなく、ブロック単位で読み上げることが最大の改善点です。 64 KBの倍数でファイルを読み書きできるようにするには、64 KBのブロックサイズを使用するようにNTFSを構成する必要があります.1回の読み込みで4 MB以上と考える必要があります。私は、非同期IOを使用して、同時に(以前に読み込まれたデータを)読み書きできるようにすることを提案します。正しく実行すると、ほとんどの現代的なハードウェアで10MBの分割実装がすでに提供されているはずです。
情報の検索中に使用されるすっきりしたトリックは、高速圧縮アルゴリズムを使用してデータを圧縮することです。ディスクIOはメモリ/ CPU操作よりも遅いので、これはおそらく同様に役立ちます。 Googleのスナッピー圧縮機は、高速圧縮アルゴリズムの良い例です。
あなたの減速はおそらくファイルを1行ずつ読むことから来ます。ファイルを一度にすべてメモリに読み込んで検索します。 – dda
http://stackoverflow.com/questions/4289353/fastest-way-to-search-ascii-files-in-c-sharp-for-simple-keywords – Ofiris
同じファイルを何度も検索する必要がありますか? – user626528