簡體   English   中英

大型數據集的內存消耗

[英]Memory consumption of a large dataset

我有一個.net winform C#程序。 我使用自己的跟蹤系統在程序上收集跟蹤。 跟蹤顯示有關用戶操作的信息以及其他有用的信息。 我將每個跟蹤存儲在數據集中。 例如,我每秒在數據集中添加一行。 僅當程序遇到未處理的異常或程序關閉時,程序才會布置跟蹤。

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

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

我必須找到一種方法,通過保留數據集中包含的所有信息來釋放此數據集的內存使用,還必須找到一種向該數據集添加附加行的方法。

有人有想法或指導嗎? 謝謝

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

這樣,您的內存消耗就可以了,並且您的性能每小時只能達到一次。

由於磁盤上的文件都具有相同的結構,因此只要您需要“完整數據”,就可以將它們合並。

盡管我建議使用一些現有的日志記錄庫,但是這里有很多經過良好測試的庫(免費和商業)。

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

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

在將log4net用於Winforms項目之前,請先使用log4net ,最好在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");
        }


    }
}

應該就是這樣。 它簡單而強大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM