ファイルあたりのサイズが 50KB の XML ファイルが約 50000 個あります。これらのファイル内のデータを検索したいのですが、これまでの解決策は非常に遅いです。検索パフォーマンスを向上させる方法はありますか?
6 に答える
軽量、高速、フラットなファイル検索インデックス作成エンジンであるLucene.NETを使用できます。
入門チュートリアルについては、http://codeclimber.net.nz/archive/2009/09/02/lucene.net-your-first-application.aspxを参照してください。
Windows を使用しており、Windows デスクトップ サーチを使用してファイルをすばやく検索できると想定しています。ファイルが変更されるたびに更新される Windows インデックスを使用します。.NET から使用できるSDK はこちらから入手できます。
ファイルのコンテンツをいつでもデータベースにインデックス付けして、そこで検索を実行できます。データベースは、検索に関してはかなりのパフォーマンスを発揮します。
You could spin up a Splunk instance and have it index your files. It's billed mostly as a log parser but would still serve your needs. It tokenizes files into words, indexes those words, and provides both a web-based and a CLI-based search tool that supports complex search criteria.
XML データベースを使用します。通常の推奨事項は、オープン ソースが必要な場合は eXist、商用のものが必要な場合は MarkLogic ですが、Microsoft であることが重要であり、究極の XML 機能が必要ない場合は SQL Server を使用できます。また、評価したい場合は、他にもたくさんあります。すべてのデータベース製品は学習曲線が急ですが、これらのデータ ボリュームに対しては適切なソリューションです。
これらの XML ファイルの性質に大きく依存します。再生成されない 50,000 個の XML ファイルだけですか? それとも常に変化していますか?検索用に索引を付けたい XML ファイル内に特定の要素しかありませんか?
確かに、50k ファイル ハンドルを開き、その内容を読み取り、テキストを検索すると、非常に遅くなります。Pavel に同意します。データをデータベースに入れるとパフォーマンスが大幅に向上しますが、XML ファイルが頻繁に変更される場合は、それらをデータベースと同期させる何らかの方法が必要になります。
独自のソリューションを作成する場合は、すべてのファイルをスキャンして単語インデックスを作成することをお勧めします。ファイルが頻繁に変更される場合は、「最終更新日」も追跡する必要があります。ファイルがそれよりも最近変更された場合は、インデックスを更新します。このようにして、1 つの巨大な単語インデックスが作成されます。検索が「foo」の場合、インデックスはその単語がファイル file39209.xml、file57209、および file01009.xml で見つかることを明らかにします。XML の性質によっては、要素をインデックス ファイルに格納することもできます (これは、本質的に、すべての XML ファイルを 1 つにフラット化するようなものです)。