2013-02-12 11 views
13

C#を使用してテキストファイルのグループ内で約13文字の文字列を検索する必要があります。テキストファイルの数は変化しており、100〜1000の範囲になります。ファイルのサイズは、1KB〜10MBの範囲で設定できます。テキストファイル内の文字列を高速に検索する

私は行ずつ、それを読んで、文字列が(index.ofを使用して)が存在するかどうかを確認し、それぞれのファイルを開くの素朴な方法を試してみましたが、これは遅すぎます。私はまた、Boyer-Mooreアルゴリズムを使ってみましたが、これは5秒でタイミングを改善しましたが、まだ遅いです。

検索をスピードアップする方法はありますか?

+2

あなたの減速はおそらくファイルを1行ずつ読むことから来ます。ファイルを一度にすべてメモリに読み込んで検索します。 – dda

+0

http://stackoverflow.com/questions/4289353/fastest-way-to-search-ascii-files-in-c-sharp-for-simple-keywords – Ofiris

+0

同じファイルを何度も検索する必要がありますか? – user626528

答えて

3

オペレーティングシステムのファイル検索でコンテンツを使用することを検討する必要があります。見てみるMicrosoft Windows Search 3.x SDK

また、PLINQを使用してファイルの配列を検索することもできます。メモリ内のテキストファイルを読み込み

をして一度だけで文字列全体を検索:オプションが頭に浮かぶ

File Content and Directory Search using Directory.GetFiles and PLINQ

+1

downvotingではありませんが、私は理解できます:PLINQと並行してばかげたソリューション(基本的にIndexOf)を作成しています。これは良い解決策にはなりません。基本的にもっとハードウェアを投入してもっと早く。これは男に複数のスレッドでファイルを読んで処理させるようなものです。彼が示唆しているように、boyer-mooreを使うことは、これよりずっと優れています。また、MS Searchがカスタムトークン化をサポートしているかどうかはわかりませんが、これは要件のようです。だから、検索専門家としての私の意見では、あなたよりもはるかに良い答えがあります。申し訳ありません...私は良い意思を感謝します。 – atlaste

+0

華麗!そのPLINQはファーストです!そしてちょうどカップルライン!代わりにReadAllTextを使用しました。これが最速です。 –

3

2:このリンクを参照してください。

これが遅すぎたり、メモリが空いていることが判明した場合は、Apache Luceneのようなインデクサを使用してください。ここでLucene.net

という.NET、ために利用可能なそのための素晴らしいと簡単なSDKは、そのための小さな紹介がありますされています http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net

1

コンピュータがメモリにすべてのテキストファイルをロードしようとし、それを扱うことができる場合( technique shown hereを使用してメモリ内のテキストを評価する

すべてのファイルを一度に処理できない場合は、最小のファイルに対してこれを実行します。ファイルI/Oはここで最大の支出になりますできるだけそれを最小限に抑える。

8

ホ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

Microsoftのインデックスサービスを使用して、カタログに追加するフォルダ内のドキュメントを検索できます。 Hereは、あなたのテキストファイルを検索するユーザーにできる非常に良い記事です

関連する問題