2012-02-09 132 views
2

我有一個.net winform c#程序。 我使用自己的追蹤系統收集我的程序中的痕跡。跟蹤顯示有關用戶做了什麼以及其他有用信息的信息。 我將每個軌跡存儲在數據集中。舉個例子,我每秒鐘在數據集中添加一行。 只有當程序遇到不合理的異常或程序關閉時,該程序纔會處理這些跟蹤。大型數據集的內存消耗

問題是:數據集開始在內存中非常大,並且如果程序運行足夠的時間,則會發生內存不足異常。

我在網上搜索,發現了一些想法。 - 把數據集在硬盤上的文件 (在這種情況下,我必須我想添加一個跟蹤每次打開一個大文件) - 分頁數據集

我必須找到一種方式,通過釋放內存使用這個數據集保留了它所包含的所有信息,並且還保留了向該數據集添加額外行的方法。

有人有想法或指導?謝謝

+3

使用數據庫.. – BrokenGlass 2012-02-09 21:10:14

+2

是否嘗試使用log4net? – Venki 2012-02-09 21:12:10

+1

...或平面文件。你需要在應用程序執行期間讀取所有這些值嗎? – 2012-02-09 21:12:17

回答

3

您可以將數據集的內容保存到磁盤(每小時存放在自己的文件中),清除內存數據,在內存中運行一小時,將數據保存到單獨的文件等等。

這樣你的內存消耗量應該沒問題,你的表現一小時只能擊中一次。

因爲磁盤上的文件都具有相同的結構,所以只要您需要「完整的數據」,就可以合併它們。

雖然我會建議使用一些現有的日誌庫 - 有很多經過充分測試的(免費和商業)。

+0

感謝您的幫助 – 2012-02-13 14:24:36

2

您可以使用類似NLog或企業庫中的日誌記錄塊而不是數據集,並使用滾動文件目標來編寫跟蹤。 .NET本身也有跟蹤功能,儘管它們不如NLog和其他項目先進。

一般來說,將診斷數據保存在內存中總是一個壞主意,因爲崩潰會將其清除。數據集旨在用於數據訪問和快速讀/寫操作,而不是這類事情。顯然它比簡單的文件記錄器有更高的內存開銷。

+0

感謝您的幫助 – 2012-02-13 14:24:48

2

使用log4net,然後將其用於Winforms項目,最好在App.config文件中創建一個像這樣的配置。

<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

感謝您的幫助 – 2012-02-13 14:24:55