私は、いくつかの大きな (数 MB) ログ ファイルを検索し、キーワードを含む行を返す検索機能を実装する任務を負っています。ログ ファイルは常にプールに追加されるため、毎回動的に検索する必要があります。
ファイルごとにMemoryMappedFileを作成し、キーワードに一致するように各行を反復処理することは理にかなっていますか? そうでない場合、それを行うためのより良い方法は何でしょうか?
サンプルコードへのリンクは大歓迎です。
私は、いくつかの大きな (数 MB) ログ ファイルを検索し、キーワードを含む行を返す検索機能を実装する任務を負っています。ログ ファイルは常にプールに追加されるため、毎回動的に検索する必要があります。
ファイルごとにMemoryMappedFileを作成し、キーワードに一致するように各行を反復処理することは理にかなっていますか? そうでない場合、それを行うためのより良い方法は何でしょうか?
サンプルコードへのリンクは大歓迎です。
検索用に最適化された、適切に構造化されたインデックスオブジェクトツリーをメモリ内に作成してみませんか?
編集:いくつかのコメントの後に追加...
このようなものである可能性があります:
class Index
{
public Dictionary<string, List<SourceFile>> FilesThatContainThisWord {get; set;}
...
}
class SourceFile
{
public string Path {get; set;}
...
}
// Code to look up a term
var filesThatContainMonday = myIndex.FilesThatContainThisWord["Monday"];
はい。「数 MB」はそれほど大きくなく、2 GB に簡単に収まります。
ファイルは時間の経過とともに大きくなるため、マッピング サイズを受け取るコンストラクターを使用する必要があります。また、検索のたびに Accessor または Stream を再作成する必要があると思いますが、MSDN はここでは少し不明確です。
Stream を使用すると、StreamReader を作成してすべての行を読み取るのは簡単です。プロセス全体が妥当なハードウェアで I/O バウンドになる可能性が非常に高いため、最初は CPU の最適化を気にしないでください。