VB.NET Gestion de la Mémoire
Mise à jour: j'ai sans doute confondu l'utilisation de la mémoire des problèmes avec l'INTERFACE utilisateur de partager le même thread que le traitement (comme l'a souligné MusiGenesis ci-dessous). Cependant en ce qui concerne l'utilisation de la Mémoire. Je ne suis pas encore en mesure de trouver VB.net syntaxe spécifique, bien que les gens l'ont souligné certains grands .Net et C# informations ci-dessous (et si j'étais plus versé dans ces technologies, on pourrait adapter pour travailler avec VB.net).
Je suis entrain de créer un VB.Net application.
- L'application fondamentalement Analyse de Données
Les fichiers situés sur l'ordinateur client
en DataSet/DataTables. - Ensuite à l'aide d'
DataView, il se casse la
DataTables en manageble morceaux,
écrit en XML et envoie les données XML à un
webservice.
Les concepts généraux qui fonctionnent très bien, cependant, je vais avoir des problèmes où le Mem Utilisation sur le Gestionnaire des Tâches ne cesse de croître à mesure que le programme est utilisé pour charger plus et plus de fichiers.
Au Démarrage, avant de faire quoi que ce soit, l'application VB a de 27 000 K.
Une fois que le fichier est analysé et même après j'ai la poignée de Fichier ainsi que les données augmente beaucoup. Je bande tout dans le code et il semble encore que la mémoire Mem Utilisation reste capturé. Il n'y a aucune rime ni raison pour laquelle le Mem Utilisation est en pleine expansion (c'est à dire parfois, il peut croître de 20 mo lors de la lecture d'un fichier: 7 mo, mais d'autres fois, il n'augmente pas du tout, lors de la lecture d'un fichier de 3 mo). Parfois, il appers pour libérer la mémoire quand l'analyse est terminée, et d'autres fois, il tient juste.
J'ai regardé .Net Profileur de Mémoire et n'ont pas vraiment été en mesure de faire des têtes ou queues de que.
J'ai beaucoup lu sur internet concernant la Gestion de la Mémoire .Net en Général à propos de Céder et de "Rien" et des ensembles de données, etc, cependant, n'ont pas vraiment trouvé quelque chose au sujet de VB.Net en particulier.
Ma Question est: existe-il des bons tutoriels/livres/blogs/etc qui montrent un plus en profondeur tutoriel sur la gestion de la mémoire dans un VB.Net application (c'est à dire comment/quand à jeter/fermer, etc), ou quelqu'un aurait-il quelques conseils à partir de là l'expérience.
OriginalL'auteur Brian | 2009-09-13
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devez réaliser que le Gestionnaire des Tâches est de vous montrer la quantité de mémoire que le système d'exploitation a alloué à votre demande. Ce n'est pas nécessairement la quantité de mémoire réellement utilisée. Lorsqu'un .NET application tout d'abord, le système d'exploitation alloue de la mémoire pour elle, comme elle le fait pour tout processus. L' .NET runtime, puis de plus amples divise la mémoire et gère la façon dont il est utilisé. Le moteur d'exécution peuvent être considérés comme des "gourmands" qu'une fois la mémoire allouée par le système d'exploitation, il ne va pas à moins d'être spécifiquement demandé par le système d'exploitation. Le résultat est que l'utilisation de la mémoire dans le Gestionnaire des Tâches n'est pas exacte.
Pour obtenir une image fidèle de votre utilisation de la mémoire, vous devez utiliser l'analyseur de Performances et ajouter les compteurs appropriés.
Autant que
IDisposable
et le modèle dispose, vous ne trouverez probablement pas beaucoup qui en parle dans un langage spécifique car c'est quelque chose que fournis par le .NET Framework lui-même et le langage est agnostique. Le motif est le même quelle que soit la langue que vous utilisez, seule la syntaxe est différente.Il y a plusieurs références disponibles qui vous donnera des informations sur la façon dont la gestion de la mémoire des œuvres. J'ai deux billets de blog, qui parle de À l'aide de la Collecte des Ordures .NET et qui répertorie les différents ressources j'ai utilisé pour créer deux présentations sur la gestion de la mémoire .NET.
Le meilleur de la "règle du pouce", c'est que si une classe implémente
IDisposable
, il le fait pour une raison et vous devriez vous assurer que vous appelezDispose()
lorsque vous avez terminé d'utiliser l'instance. C'est plus facile à faire avec laà l'aide de
déclaration.Sans connaître plus de détails de ce que vous faites dans le code c'est difficile pour aider à réduire vers le bas, vous risquez de rencontrer un problème. Assurez-vous de vous débarrasser de tout jetable objets dès que vous avez terminé avec eux. Aussi, regardez pour des choses comme la concaténation de chaîne à l'intérieur des boucles. Vous ne précisez pas quelle version de la .NET Framework que vous utilisez, mais si la version 3.0 ou plus tard, vous voudrez peut-être regarder à l'aide de la binaire sérialiseur pour envoyer les ensembles de données à travers le fil à la webservice, si possible.
OriginalL'auteur Scott Dorman
De gestion de la mémoire dans VB.Net est en fait pris en charge par l' .Net Framework, donc, en général, c'est la même chose dans VB.Net comme en C#. Cependant, la compréhension de la façon dont il fonctionne vous permet de prendre de meilleures décisions de programmation - quand déclarer des variables, lorsque les objets sont disposés, Dans ce contexte, je pense que votre question pourrait être formulée comme "y at-il de bonnes sources pour me dire comment le code de manière efficace et pour une plus petite empreinte mémoire", OU "quelqu'un Peut-il me dire pourquoi ce truc bizarre qui se passe". Les deux questions peuvent être répondues en donnant une meilleure compréhension de la façon dont .Net gère la mémoire, de la portée, etc. Il ya des tonnes de ressources pour répondre à cette question,
Cela dit, ce premier lien a beaucoup d'autres liens qui pourraient être utiles à vous:
http://geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx
Et ce dernier est plus au point:
http://www.c-sharpcorner.com/UploadFile/tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx
OriginalL'auteur David
Si j'étais vous, je voudrais tout d'abord utiliser un profiler pour voir exactement ce que l'application est en train de faire. Il y a plusieurs JetBrains, RedGate, YourKit. À partir de là, vous pouvez voir exactement où la mémoire n'est pas libérée.
Ensuite, vous pouvez voir exactement où vous avez besoin de se concentrer pour corriger le problème
OriginalL'auteur Rad
Ce n'est pas une réponse à votre question d'ordre général, mais vous pouvez envoyer un DataTable directement à un service web sans l'étape intermédiaire de premier écrit en XML. En fait, vous ne pouvez pas envoyer un DataTable, mais vous peut envoyer un DataSet (parce que DataSet est sérialisable tout DataTable n'est pas), de sorte que vous pouvez envoyer un DataTable directement par les premières en l'enveloppant dans un jeu de données, puis de les envoyer le jeu de données. Le protocole SOAP convertit le jeu de données au format XML de toute façon, si vous n'êtes pas vraiment gagner quoi que ce soit par la conversion de la Table de données au format XML vous-même.
Je devine votre question que vos tables de données sont trop grandes pour les envoyer tous à la fois, ou bien vous êtes de les briser en petits morceaux, de sorte que votre application client peut indiquer la progression de l'utilisateur. Cela peut aussi être fait sans l'écriture du contenu au format XML vous-même.
Concernant votre question d'ordre général, il n'est pas surprenant que, parfois, votre mémoire, la consommation augmente de 20 mo lors de la lecture (et de l'envoi d'un fichier: 7 mo. Le langage XML utilisé pour décrire un DataTable et son contenu (si vous le faites vous-même ou être sérialisé automatiquement lorsque vous l'envoyez à un service web directement) est très détaillé.
Votre meilleure approche à ce problème serait d'envoyer les données du client directement des fichiers sur le service web (soit en un seul byte[] tableau ou d'une série de byte[] tableau), puis de traiter ces dossiers entièrement sur le serveur. Cette approche permettra de réduire la longueur de temps nécessaire à l'envoi de chaque fichier sur le serveur (parce que l'envoi de 7mo prend moins de temps que l'envoi de 20 mo, voire plus).
Edit: je voulais dire ..."la mémoire n'est pas libérée" (pas les données)
Edit: ci-Dessus, en gros ce que je veux dire, c'est que je dois supprimer des enregistrements des fichiers avant de les envoyer au serveur, donc j'ai besoin d'analyser et quel que soit la taille du fichier XML n'est pas vraiment la question (comme ce devrait juste être un temporaire bosse dans la mémoire). Je veux juste comprendre comment libérer de la mémoire une fois le fichier XML a été envoyé au serveur et le programme est juste en attente pour analyser le fichier suivant. Je ne suis pas assez expérimenté dans Gagner Apps à la figure/trace où cette mémoire est stockée.
afin de clarifier votre question, êtes-vous éprouver réellement pénurie de problèmes de mémoire, ou êtes-vous juste de vous inquiéter à ce sujet parce que de ce que vous voyez en Mem Utilisation? Vous pouvez appeler la Jeter sur le jeu, mais je ne suis pas sûr que c'est même nécessaire si vous êtes en permettant à l'ensemble de données pour aller hors de portée après vous avez terminé avec elle. Aussi, vous pouvez l'appeler "GC.Collect();" - cela pourrait entraîner une chute immédiate de Mem Utilisation. En général, cependant, je ne vous inquiétez pas à ce sujet, sauf si vous commencez à exécuter en apparent, manifeste des problèmes.
désolé pour le discours de ma réponse - vos raisons de faire les choses côté client sont parfaitement valides. Cependant, je voudrais juste envoyer le jeu de données directement vers le service web à la place de l'écriture dans un fichier XML, sauf si vous avez déjà vaste de code dans le service web qui attend XML.
OriginalL'auteur MusiGenesis
Le meilleur livre pour en obtenir sur le sujet que j'ai lu est Jeff Richter livre, CLR via C#:
http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=sr_1_1?ie=UTF8&qid=1252853101&sr=8-1-spell
Si vous voulez un VB.NET version, ils ont, pour la première édition de ce livre, mais je ne pense pas qu'il y avait assez d'intérêt pour traduire le livre en VB.NET pour la deuxième version. Si vous voulez vraiment apprendre .NET, vous devriez obtenir à l'aise avec le C#. Dans les deux langues, la mémoire est gérée par le CLR.
OriginalL'auteur Dave Markle