1

何か知りたいのですが、このループはすべての日 (7 回) 実行され、その中に別のループがあり、ファイル内のすべてのレコードに対して実行されます。(約 100000) したがって、全体で約 700000 回、各ループの各処理をログに記録し、それをファイルに記録したいと思います。たとえば、最初のループの内部にいて、最初のループの中にいるとします。毎回、何が行われたかをファイルに記録します。しかし、問題は、毎回ログに記録すると、非常に多くの IO 操作のためにパフォーマンスがひどく損なわれることです。私が考えていたのは、すべてのステップをメモリに記録する方法があるということです (メモリ ストリームまたは何か)そして外側のループの終わりに、そのすべてのメモリストリームデータをファイルに記録しますか?

私が持っているかどうか言う

for (int i=0; i<7; i++)
{
  for (int j=0; j<RecordsCount; j++)
  {
    SomeOperation();
    // I am logging to a file here right now
  }
}

パフォーマンスがひどく低下します。ログ ファイルを削除すると、はるかに早く完了することができます。そのため、最初にメモリにログを記録し、そのすべてのログをメモリからファイルに書き込む方がよいと考えていました。それで、これを行う方法はありますか?たくさんあるとしたらどれが一番いいですか?

ps: http://www.codeproject.com/Articles/23424/TracerX-Logger-and-Viewer-for-NETを見つけたロガーはここにありますが、必要に応じて他のカスタム ロガーやその他のものを使用できます。

編集:メモリ ストリームを使用し、それをすべてファイルに書き込むと、File.AppendAllLinesYorye と zmbq の回答で提案されているように使用するよりもパフォーマンスが向上しますか?

4

3 に答える 3

2

これは単なる例ですが、アイデアを得ることができます。

あなたは本当に解決策を持っていました、あなたはそれをする必要がありました...

for (int i=0; i<7; i++)
{
    var entries = new List<string>();

    for (int j=0; j<RecordsCount; j++)
    {
        SomeOperation();

        // Log into list
        entries.Add("Operation #" + j + " results: " + bla bla bla);
    }

    // Log all entries to file at once.
    File.AppendAllLines("logFile.txt", entries);
}
于 2012-06-03T04:45:12.627 に答える
1

独自のロギング フレームワークを作成する代わりに、適切なロギング フレームワークを使用してみませんか?

たとえば、NLog にはバッファリングが組み込まれており、簡単に構成できます: https://github.com/nlog/NLog/wiki/BufferingWrapper-target

プロジェクトに価値を与えるコードを書くことに集中し、他のすべてのものには既存のソリューションを再利用することをお勧めします。それはおそらくあなたをより効率的にし、より良い結果をもたらすでしょう:-)

于 2012-06-03T20:27:43.577 に答える
0

700,000行をファイルに記録するのに、十分なバッファがあれば、それほど時間がかかることはありません。実際、ループの外側で一度に実行する場合と比較して、ループの内側で実行する場合は、それほど長くはかからないはずです。

を使用しないでくださいFile.AppendAllLines。代わりに、ファイルへのストリームを開き、バッファが配置されていることを確認して、それを介して書き込みます。

于 2012-06-03T04:51:30.333 に答える