10

リモート マシンからいくつかのログ ファイルを解析する必要があるという問題があります。いくつかの複雑な問題があります: 1) ファイルが使用中の可能性がある 2) ファイルが非常に大きい (100 MB 以上) 可能性がある 3) 各エントリが複数行である可能性がある

使用中の問題を解決するには、まずコピーする必要があります。現在、リモート マシンからローカル マシンに直接コピーし、そこで解析しています。これが問題 2 につながります。ファイルが非常に大きいため、ローカルにコピーするにはかなりの時間がかかります。

解析時間を短縮するために、パーサーをマルチスレッド化したいと考えていますが、これにより、複数行のエントリの処理が少し難しくなります。

2つの主な問題は次のとおりです。1)ファイル転送を高速化するにはどうすればよいですか(圧縮?、ローカルでの転送は必要ですか?、使用中のファイルを別の方法で読み取ることはできますか?)2)複数行のエントリを処理するにはどうすればよいですか?スレッド間で行を分割するときは?

更新: サーバーで明らかな解析を行わなかった理由は、CPU への影響をできるだけ少なくしたいからです。システムの im テストのパフォーマンスに影響を与えたくありません。

4

9 に答える 9

2

シーケンシャルファイルを読み取る場合は、ネットワークを介して1行ずつ読み取ります。ストリーミング可能な転送方法が必要です。これを理解するには、IOストリーミングテクノロジーを確認する必要があります。

このような大規模なIO操作は、ネットワークを介してアイテムを読み取るのと同じ速さでアイテムを処理できる可能性があるため、マルチスレッドではあまりメリットがありません。

他の優れたオプションは、ログパーサーをサーバーに配置し、結果をダウンロードすることです。

于 2008-09-26T00:23:12.523 に答える
2

パフォーマンスの観点から見ると、より良いオプションは、リモート サーバーで解析を実行することです。例外的な状況を除けば、ネットワークの速度が常にボトルネックになるため、ネットワーク経由で送信するデータの量を制限すると、パフォーマンスが大幅に向上します。

これは、非常に多くのデータベースがサーバー側で実行されるストアド プロシージャを使用する理由の 1 つです。

マルチスレッドの使用による解析速度の向上 (もしあれば) は、ネットワーク転送の比較速度によって圧倒されます。

ファイルを解析する前に転送することにコミットしている場合、ファイル転送中にオンザフライ圧縮を使用することを検討できるオプションがあります。たとえば、オンザフライで圧縮を実行する利用可能な sftp サーバーがあります。ローカル エンドでは、 libcurlのようなものを使用して転送のクライアント側を実行できます。これは、オンザフライの解凍もサポートします。

于 2008-09-26T01:44:24.920 に答える
1

すでにファイルをコピーしていることを考えると、最も簡単な方法は、コピーする前にファイルを圧縮し、コピーが完了したら解凍することです。zipアルゴリズムは一般的にテキストファイルで非常にうまく機能するため、テキストファイルの圧縮には大きなメリットがあります。また、既存の解析ロジックをリモートネットワークテキストリーダーに接続するのではなく、そのまま維持することもできます。

この方法の欠点は、行ごとの更新を非常に効率的に取得できないことです。これは、ログパーサーにとっては良いことです。

于 2008-09-26T00:26:52.767 に答える
1

転送には圧縮を使用します。

解析が本当に遅く、プロセッサが複数ある場合は、解析ジョブを分割できます。スマートな方法でそれを行う必要があります。ワーカーが不完全なレコードの処理を担当する決定論的アルゴリズムを用意してください。たとえば、行がレコードの途中の一部であると判断できると仮定すると、ファイルを N/M セグメントに分割し、それぞれが M 行を担当します。ジョブの 1 つがそのレコードが終了していないと判断した場合、レコードの最後に到達するまで読み取りを続行する必要があります。ジョブの 1 つが、開始点がないレコードを読み取っていると判断した場合、そのレコードをスキップする必要があります。

于 2008-09-26T01:21:10.420 に答える
1

どれだけ「離れているか」にもよると思います。100Mb LAN 上の 100MB は約 8 秒です... ギガビットにすると、約 1 秒で取得できます。カードに 50 ドル * 2、スイッチに 100 ドルというのは、非常に安価なアップグレードです。

ただし、それよりも離れていると仮定すると、読み取りモードで開くことができるはずです (コピーしているときに読み取っているため)。SMB/CIFS はファイル ブロックの読み取りをサポートしているため、その時点でファイルをストリーミングする必要があります (もちろん、実際にどのようにファイルにアクセスしていたかについては言及していません。SMB を想定しているだけです)。

とにかくディスクまたはネットワークにバインドされるため、マルチスレッドは役に立ちません。

于 2008-09-26T01:04:41.363 に答える
1

ファイルをコピーできれば、それを読み取ることができます。したがって、最初からコピーする必要はありません。

EDIT : FileStream クラスを使用して、アクセス モードと共有モードをより詳細に制御します。

new FileStream("logfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

トリックを行う必要があります。

于 2008-09-26T07:36:13.700 に答える
0

私はSharpZipLibを使用して、インターネット経由で転送する前に大きなファイルを圧縮しました。これが1つのオプションです。

1)の別のアイデアは、リモートマシン上で実行され、そこで解析を実行するアセンブリを作成することです。.NET Remotingを使用して、ローカルマシンからアセンブリにアクセスできます。リモートアセンブリは、Windowsサービスであるか、IISでホストされている必要があります。これにより、ログファイルのコピーを同じマシンに保持できるようになり、理論的には、ログファイルの処理にかかる時間が短縮されます。

于 2008-09-26T00:28:09.517 に答える
0

圧縮(deflate / gzip)を使用すると役立つと思います

于 2008-09-26T00:29:15.520 に答える