2009-10-09 9 views
1

Je travaille sur un programme qui lit à partir d'un port série, puis analyse, formate et affiche les informations de manière appropriée. Ce programme, cependant, doit être exécuté pendant plus de 12 heures et plus - en traitant constamment un flux de données entrantes. Je constate que pendant que je laisse mon application fonctionner pendant un moment, l'utilisation de la mémoire augmente à un taux linéaire - pas bon pour une utilisation de 12 heures.Lecture à partir de SerialPort & Memory Management - C#

J'ai mis en œuvre un enregistreur qui écrit les données binaires entrantes brutes dans un fichier - est-ce que je peux utiliser cette idée pour effacer mon cache mémoire à intervalles réguliers? C'est à dire. comment puis-je, de temps en temps, écrire dans le fichier journal de telle sorte que les données n'ont pas besoin d'être stockées en mémoire?

Également - y a-t-il d'autres aspects d'une application Windows Form qui contribueraient à cela? Par exemple. J'imprime les chaînes formatées dans une zone de texte, qui finit par afficher la chaîne entière. Parce que cela fonctionne depuis si longtemps, il affiche facilement des centaines de milliers de lignes de texte. Dois-je écrire ceci dans un fichier et effacer le texte? Ou autre chose?

Répondre

2

De toute évidence, si la chaîne se développe au fil du temps, l'utilisation de la mémoire de votre application augmentera également avec le temps. En outre, les boîtes de texte WinForms peuvent avoir du mal à gérer de très grandes chaînes. Quelle est la taille de la chaîne?

À moins que vous ne souhaitiez vraiment afficher la totalité de la chaîne à l'écran, vous devez définitivement l'effacer périodiquement (en fonction des attentes de vos utilisateurs); Cela économisera de la mémoire et améliorera probablement les performances.

+1

Merci beaucoup! L'objet String actuel a une longueur maximale de 17 caractères. Chaque fois que la chaîne est ajoutée à l'affichage, nulled (string = "";), définit une nouvelle valeur et est ajoutée. Ensuite, rincez et répétez. Ainsi, la chaîne réelle ne reçoit pas trop grand, mais l'affichage dans le champ de saisie est parce que la chaîne est constamment ajouté à l'affichage en cours. Cela change-t-il quelque chose? – Slim

+0

Non Comment est souvent mis à jour la chaîne? (Combien de temps dure la zone de texte se?) – SLaks

+0

Le dispositif est un taux de transmission 9600 envoyer en permanence des informations.J'utilise le thread _dataReceived() pour gérer les données entrantes - je ne suis pas sûr que les détails de vitesse de ce que cela fonctionne soient, disons simplement que c'est beaucoup et rapidement. En quelques minutes, j'ai ~ 25K lignes (chaque 17 caractères de long) étant affiché. J'ai fait un test rapide où toutes les 50 itérations (de l'ajout de la chaîne 17char à l'affichage), j'efface l'affichage. Cela a montré des améliorations TREMBLANTES. Il fonctionne actuellement depuis 17 minutes et a à peine augmenté l'utilisation de mem selon taskmgr. Je pense que le problème est résolu .. merci beaucoup. – Slim

1

Normalement, la gestion de la mémoire dans .NET est complètement automatique. Vous devriez faire attention à extrapoler de courtes observations (minutes) à une période de 12 heures. Et s'il vous plaît noter que TaskManager n'est pas un très bon outil pour mesurer l'utilisation de la mémoire.

L'écriture des données entrantes ne doit pas augmenter significativement l'utilisation de la mémoire. Mais il y a quelques choses que vous devriez éviter de faire, et concaténer à une corde encore et encore est l'un d'entre eux. Votre TextBox coûte probablement beaucoup plus que vous ne le pensez. Utiliser un ListBox serait plus efficace. Et plus facile.

+1

Il n'est * pas * * complètement * automatique, car le CPG ne peut pas collecter des objets référencés ("rootés") bien qu'ils ne puissent plus jamais être utilisés. –

+0

Merci pour l'information - aide certainement ma compréhension. Je vais certainement envisager d'utiliser un ListBox et peut-être une autre application pour surveiller l'utilisation des mem. Actuellement "stress" tester l'application maintenant - Je me méfie encore d'extrapoler mes tests de 10 minutes à 12 heures, comme vous l'avez mentionné. J'espère que je peux obtenir une bonne heure ou 2 et vérifier les résultats pour quelque chose de légèrement plus précis. Encore une fois merci. – Slim

0

J'ai plusieurs applications série qui s'exécutent en tant qu'application ou en tant que service Windows. Ceux-ci doivent être en hausse 24/7-365. Le meilleur mécanisme que j'ai trouvé pour éviter ce même problème est double.

1) Écrivez les informations dans un fichier journal. Pour un service, c'est le seul moyen d'obtenir l'information. Le fichier journal n'augmente pas votre utilisation de la mémoire.

2) Pour l'application, écrivez l'information dans un fichier journal et placez-la dans une liste. Je limite généralement la liste aux 500 ou 1000 dernières entrées. Avec les nouveaux contrôles .net, les zones de liste sont virtualisées, ce qui aide mais vous ne rencontrez pas d'autres problèmes de mémoire tels que la concaténation de la zone de texte.

Vous pouvez prendre un système vers le bas avec une zone de texte en ajoutant constamment la chaîne sur un certain nombre d'heures car il ne vise pas à ce genre d'abus de la boîte.