2012-02-09 6 views
2

J'ai un programme .net winform C#. Je recueille des traces sur mon programme, avec mon propre système de trace. Les traces montrent des informations sur ce que l'utilisateur a fait et d'autres informations utiles. Je stocke chaque trace dans un ensemble de données. Un exemple, j'ajoute une ligne dans le jeu de données chaque seconde. Le programe ne dispose des traces que lorsque le programme rencontre une exception de type undhandler ou lorsque le programme se ferme. Le problème est le suivant: Le jeu de données commence à être très volumineux dans la mémoire, et si le programme exécute suffisamment de temps, une exception d'insuffisance de mémoire se produit. Je recherche sur le web et j'ai trouvé quelques idées. - mettre l'ensemble de données dans un fichier sur le disque dur (dans ce cas, je dois ouvrir un grand fichier à chaque fois que je veux ajouter une trace) - Pagination l'ensemble de donnéesConsommation mémoire d'un grand ensemble de données

Je dois trouver un moyen de libérer l'utilisation de la mémoire par cet ensemble de données en conservant toutes les informations qu'il contient et également garder un moyen d'ajouter des lignes supplémentaires à cet ensemble de données.

Quelqu'un a des idées ou un guidage? Merci

+3

Utilisez une base de données. – BrokenGlass

+2

Avez-vous essayé d'utiliser log4net? – Venki

+1

... ou un fichier plat. Avez-vous besoin de * lire * toutes ces valeurs lors de l'exécution de l'application? –

Répondre

3

Vous pouvez enregistrer le contenu de l'ensemble de données sur le disque (toutes les heures dans son propre fichier), effacer les données en mémoire, exécuter pendant une heure en mémoire, enregistrer les données dans un fichier séparé, etc. De cette façon, votre consommation de mémoire devrait être correcte et votre performance ne sera atteinte qu'une fois par heure.

Étant donné que les fichiers sur le disque ont tous la même structure, ils peuvent être fusionnés chaque fois que vous avez besoin de "données complètes".

Bien que je recommanderais d'utiliser une bibliothèque de journalisation existante - il y en a beaucoup qui ont été testés (gratuit et commercial).

+0

merci pour votre aide –

2

Vous pouvez utiliser quelque chose comme NLog ou le bloc de journalisation dans la bibliothèque d'entreprise au lieu d'un jeu de données et utiliser une cible de fichier tournant pour écrire votre trace. .NET lui-même dispose également d'installations de traçage, bien qu'elles soient moins avancées que NLog et d'autres projets.

De manière générale, c'est toujours une mauvaise idée de conserver les données de diagnostic en mémoire, car un crash l'efface. Un dataset est destiné à l'accès aux données et aux opérations de lecture/écriture rapides, pas ce genre de chose. Évidemment, il a un temps de mémoire beaucoup plus élevé qu'un simple enregistreur de fichiers.

+0

merci de votre aide –

2

Utilisez log4net avant de l'utiliser pour votre projet Winforms créez une configuration comme celle-ci de préférence dans votre fichier 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 

C'est très simple à comprendre. Vous pouvez voir le chemin vers le fichier journal répertorié dans la configuration App.config (vous pouvez personnaliser d'autres choses relatives à votre application à partir des paramètres de configuration). Ensuite, à partir de votre application, utilisez ceci pour initialiser le 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"); 
     } 


    } 
} 

Cela devrait être à peu près tout. C'est simple et très puissant.

+0

je vous remercie pour votre aide –

Questions connexes