2012-02-09 86 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