大型数据集的内存消耗

本文关键字:内存 数据集 大型 | 更新日期: 2023-09-27 18:23:52

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

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

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

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

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

大型数据集的内存消耗

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

这样你的内存消耗应该还可以,而且你的性能每小时只会受到一次影响。

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

尽管我建议使用一些现有的日志库,但有很多测试良好的日志库(免费和商业)。

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

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

在将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");
        }

    }
}

应该就是这样。它简单而强大。