私は、大きなログ ファイルを読み取る必要がある場所に書きたい単純なツールの設計段階にあります。いくつかのコンテキストを提供するために、まずそれについて説明します。
読み取る必要があるログ ファイルは、常に次の 3 行の形式で構成されるログ エントリで構成されています。
statistics : <some data which is more of less of the same length about 100 chars>
request : <some xml string which can be small (10KB) or big (25MB) and anything in between>
response : <ditto>
ログ ファイルのサイズは約 100 ~ 600 MB になる可能性があり、これは多くのログ エントリを意味します。これで、これらのログ エントリは相互に関係を持つことができます。そのためには、ファイルを最後から最初まで読み始める必要があります。これらの関係は、統計行から推測できます。
統計行の情報を使用して、ユーザーがデータを検索し、フィルタリング操作を行うために使用できるデータグリッドを構築したいと考えています。ユーザーが実際に必要とするまで、要求/応答行をメモリにロードしたくありません。さらに、ロードされるリクエスト/レスポンス エントリの最大数を制限することで、メモリの負荷を小さく保ちたいと考えています。
そのため、ファイルを初めて解析して統計のインデックスを作成するときに、統計行のオフセットを保存する必要があると思います。次に、ユーザーがログエントリの要素である統計をクリックすると、このオフセットを使用してファイルから要求/応答を読み取ります。次に、ロードされた要求/応答エントリがあまりないように注意するメモリプールを保持できます (前述の req を参照)。
問題は、ユーザーが要求/応答データを必要とする頻度がわからないことです。それはたくさんかもしれませんし、数回かもしれません。さらに、ログ ファイルはネットワーク共有からロードできます。
私が持っている質問は次のとおりです。
- これは、多くの読み取り操作が発生する可能性があるため、メモリ マップド ファイルを使用する必要がある場合のシナリオですか? それとも、プレーンなファイルストリームを使用する方が良いですか. ところで。この段階ではログ ファイルへの書き込み操作は必要ありませんが、将来的には必要になる可能性があります。
これまでのところ、他のヒントや私の考えに欠陥がある場合は、私にも知らせてください. 私はどんなアプローチにもオープンです。
アップデート:
さらに明確にするために:
ユーザーがドライブまたはネットワーク共有からログ ファイルをロードするときに、ツール自体が解析を行う必要があります。
ツールは WinForms アプリケーションとして作成されます。
ユーザーは、選択したログ エントリをエクスポートできます。現時点では、このエクスポートの形式は不明です (バイナリ、ファイル データベース、テキストファイル)。このエクスポートは、ユーザーが行った選択のみを表示するアプリケーション自体によってインポートできます。