c# ファイル読み込み メモリにログし、ファイルに書き込みます。




c# ファイル読み込み (3)

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

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

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);
}

私は何かを知りたがっていますが、このループはすべての日(7回)実行され、その中の別のループがファイル内のすべてのレコードに対して実行されます。 (約100000)ですので、すべて約700000回です。今は、各ループで各処理をログに記録し、ファイルに記録します。最初のループは最初のループ、2回目は最初のループです。我々は毎回ログを記録し、ファイル内で何が行われるかを記録します。 しかし、問題は、私が毎回ログを記録すると、非常に多くの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.AppendAllLines Yoryeとzmbqの回答として示唆された場合、それは私に何かJeremyコメント以上のパフォーマンスの向上を与えるだろうか?


Answer #1

十分なバッファーがあれば、ファイルに70万行をロギングしてはなりません。 実際には、ループの内側で行うのではなく、ループの外側ですぐに行うほうが時間がかかりません。

File.AppendAllLinesなどを使用しないでください。代わりに、ファイルへのストリームを開き、バッファを確保してから書き込んでください。


Answer #2

独自のログフレームワークを使用するのではなく、適切なログフレームワークを使用してみませんか?

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

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







io