5

後片付けを任されたアプリケーションがあります。アプリケーション自体は比較的単純です。SQLクエリを実行し、Webサービスを使用して、結果をログファイルに出力します。私の仕事は、アプリケーションが完了した後、ファイルをNASにアーカイブすることです。ファイルが完了するまでファイルを排他的にロックするため、少し複雑になります。また、ログだけで、アプリケーションに触れることは許可されていません。とにかく私のアプリケーションはかなり単純です:

  1. ファイルを開くことができるかどうかを確認し(IOExceptionをキャッチ)、例外がスローされない場合は、bool[]でアクセス可能としてマークを付けます。
  2. trueとマークされたファイルの配列を調べ、ReadLineメソッドを使用してファイルの各行をStreamReaderに読み込みます。アプリケーションが一時的に中断して終了しないことがあるため、IOExceptionを使用して、ファイルが完了したかどうかを判断することはできません。実際にテキストを解析する必要があります。
  3. 完了を示すテキストが見つかった場合は、ファイルをzip形式で圧縮し、アーカイブされたファイルをNASにロードして、元のファイルを削除します。

私のコードは機能しますが、非常に時間がかかります(ログファイルはそれぞれ約500 MBです)。改善についての私の考えは、ファイルの上部からではなく下部から検索を開始することですが、StreamReaderはそのような方法をサポートしていません。ReadToEndメソッドを使用してから逆読み取りを行うことはできません。これは、メモリ不足の例外がスローされるだけだからです。ログファイルの解析を高速化する方法について何か考えはありますか?

4

1 に答える 1

6

ファイルの最後にある単一のマーカーを探して、それが終了したかどうかを判断すると思いますか?もしそうなら、私はまた、マーカーが既知の長さであると仮定します。たとえば、1バイトまたは3バイトのシーケンスなどです。

上記の仮定が正しければ、FileStreamを開き、ファイルの最後までシークして、予想されるマーカーの長さを引いてバイトを読み取り、マーカーが存在して完了している場合は、ファイルを処理できることがわかります。

最後までシークする-3バイトは次のようなコードで実行できます

// Seek -3 bytes starting from the end of the file
fileStream.Seek(-3, SeekOrigin.End);
于 2010-06-04T17:25:06.137 に答える