2012-02-09 10 views
2

私は.net winform C#プログラムを持っています。 自分のトレースシステムを使用して自分のプログラムでトレースを収集します。トレースは、ユーザーが行ったことに関する情報とその他の有用な情報を表示します。 各トレースをデータセットに保存します。たとえば、毎秒データセットに行を追加します。 プログラムは、プログラムがハンドラの例外を検出したとき、またはプログラムが終了したときにのみ、トレースを破棄します。大きなデータセットのメモリ消費

問題は次のとおりです。データセットがメモリ内で非常に大きくなり始め、プログラムが十分な時間実行されている場合、メモリ不足例外が発生します。

私はウェブを検索してアイデアを見つけました。 - ハードドライブ上のファイルにデータセットを入れ (このケースでは私は大きなファイル私は、トレースを追加するたびに開く必要があります) - データセットをページング私がすることによって、メモリの使用を解放する方法を見つける必要があります

をこのデータセットに含まれるすべての情報を保持し、このデータセットに追加の行を追加する方法も保持します。

誰かがアイデアや指導を持っていますか?ありがとう

+3

データベースを使用してください。 – BrokenGlass

+2

あなたはlog4netを使ってみましたか? – Venki

+1

...またはフラットファイル。アプリケーションの実行中にこれらの値をすべて*読み込む必要がありますか? –

答えて

3

データセットの内容をディスクに保存したり(メモリ内のデータを1時間ごとに保存する)、メモリ内のデータを消去したり、メモリ内で1時間実行したり、データを別のファイルに保存したりすることができます。

この方法では、メモリ消費量は問題なく、1時間に1回しかパフォーマンスが低下しません。

ディスク上のファイルはすべて同じ構造であるため、「完全なデータ」が必要なときはいつでもマージできます。

既存のロギングライブラリを使用することをお勧めしますが、十分にテストされたものが多数あります(無料で市販されています)。

+0

ご協力いただきありがとうございます –

2

データセットの代わりにNLogまたはエンタープライズライブラリのロギングブロックを使用し、ローリングファイルターゲットを使用してトレースを書き込むことができます。 .NET自体もトレース機能を備えていますが、NLogやその他のプロジェクトよりも高度な機能はありません。

一般に、診断データをクラッシュさせるとメモリ内に保持するのは悪い考えです。データセットは、データアクセスと迅速な読み書き操作を目的としたものであり、このようなものではありません。明らかに、単純なファイルロガーよりもずっと高いメモリオーバーヘッドを持っています。

+0

ご協力いただきありがとうございます –

2

ファイルで、このような設定をWinformsプロジェクトに使用する前にlog4netを使用してください。

<configuration> 
    <configsections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"> 
    </section> 
    <log4net> 
    <root> 
     <level value="DEBUG"> 
     <appender-ref ref="LogFileAppender"> 
    </appender-ref> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="C:\MyLogFolder\Customlog.txt"><param name="AppendToFile" value="true"><rollingstyle value="Size"> 
     <maxsizerollbackups value="10"> 
     <maximumfilesize value="10MB"> 
     <staticlogfilename value="true"> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"></layout> 
    </staticlogfilename> 
    </maximumfilesize> 
</maxsizerollbackups> 
</rollingstyle></appender></level></root></log4net></configsection 

非常に分かりやすいです。 App.config設定にリストされているログファイルのパスを見ることができます(アプリケーションに関連する他のものを設定設定からカスタマイズできます)。あなたのアプリケーションからこれを使用してlog4netを初期化してください。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using log4net; 
using log4net.Config; 

namespace Log4Net 
{ 
    public partial class Form1 : Form 
    { 

     private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     public Form1() 
     { 
      InitializeComponent(); 
      log4net.Config.XmlConfigurator.Configure(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      log.Warn("Custom Warning Message"); 
      log.Debug("Custom Debug Message"); 
      log.Info("Custom Info Message"); 
      log.Error("Custom Error Message"); 
     } 


    } 
} 

これはちょうどそれであるはずです。そのシンプルで非常に強力な。

+0

ご協力いただきありがとうございます –