大数据集的内存消耗

时间:2012-02-09 21:07:40

标签: c# dataset trace out-of-memory

我有一个.net winform c#程序。 我用自己的跟踪系统收集程序上的痕迹。跟踪显示有关用户执行操作的信息以及其他有用信息。 我将每个跟踪存储在数据集中。例如,我每秒在数据集中添加一行。 只有当程序遇到不正当的异常或程序关闭时,程序才会处理跟踪。

问题是:数据集在内存中开始变得非常大,如果程序运行的时间足够长,则会发生内存不足异常。

我在网上搜索,我发现了一些想法。   - 将数据集放在硬盘驱动器上的文件中(在这种情况下,我每次要添加跟踪时都必须打开一个大文件)   - 分页数据集

我必须找到一种方法来释放此数据集使用的内存,方法是保留它所包含的所有信息,并保留一种向该数据集添加额外行的方法。

有人有想法或指导吗?谢谢

3 个答案:

答案 0 :(得分:3)

您可以将数据集的内容保存到磁盘(每小时在其自己的文件中),清除内存中的数据,在内存中运行一小时,将数据保存到单独的文件中等等。

这样你的内存消耗就可以了,你的性能每小时只能达到一次。

由于磁盘上的文件都具有相同的结构,因此只要您需要"完整的数据,就可以合并它们。

虽然我建议使用一些现有的日志库 - 但有很多经过充分测试的日志库(免费和商业版)。

答案 1 :(得分:2)

您可以使用NLog之类的内容或企业库中的日志记录块而不是数据集,并使用滚动文件目标来编写跟踪。 .NET本身也有跟踪设施,尽管它们不如NLog和其他项目先进。

一般来说,将诊断数据保存在内存中总是一个坏主意,因为崩溃会消除它。数据集用于数据访问和快速读/写操作,而不是此类操作。显然,它比简单的文件记录器具有更高的内存开销。

答案 2 :(得分:2)

使用log4net之前,为Winforms Project使用它,最好在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");
        }


    }
}

那应该是关于它的。它简单而且非常强大。