Question

Mise à jour: j'ai probablement confondu des problèmes d'utilisation de la mémoire avec l'interface utilisateur partageant le même thread que le traitement (comme indiqué par MusiGenesis ci-dessous). Cependant en ce qui concerne l'utilisation de la mémoire. Je ne parviens toujours pas à trouver la syntaxe spécifique à VB.net, bien que des personnes aient signalé quelques informations intéressantes .Net et C # ci-dessous (et si je connaissais mieux ces technologies, on pourrait s’adapter pour utiliser VB.net).

Je crée une application VB.Net.

  • L'application analyse essentiellement les données Fichiers situés sur la machine cliente dans DataSet / DataTables.
  • Ensuite, en utilisant DataView, il décompose le DataTables en morceaux contrôlables, écrit en XML et envoie les données XML à un service Web.

Les concepts généraux fonctionnent bien, mais je rencontre des problèmes en raison desquels Mem Usage on Task Manager continue de croître au fur et à mesure que le programme est utilisé pour charger de plus en plus de fichiers.

Au démarrage, avant de faire quoi que ce soit, l'application VB en a 27 000 Ko. Une fois que le fichier est analysé et même après que je dispose du descripteur de fichier, les données augmentent considérablement. Je supprime tout dans le code et il semble toujours que la mémoire dans Mem Usage reste capturée. Il n’existe aucune rime ou raison expliquant pourquoi l’utilisation de Mem augmente (c’est-à-dire qu’elle peut parfois augmenter de 20 mb lors de la lecture d’un fichier de 7 Mo, mais qu’elle n’augmente pas du tout lors de la lecture d’un fichier de 3 Mo). Parfois, il est préférable de libérer de la mémoire une fois l’analyse terminée et, parfois, elle ne tient que.

J'ai consulté .Net Memory Profiler et je n'ai pas vraiment réussi à en faire une tête.
J'ai beaucoup lu sur Internet à propos de la gestion de la mémoire sur .Net en général à propos de Dispose et de "Nothing". et DataSets, etc., n’ont toutefois rien trouvé de particulier en ce qui concerne VB.Net.

Ma question générale est : Existe-t-il de bons tutoriels / livres / blogs / etc. qui présentent un didacticiel plus détaillé sur la gestion de la mémoire dans une application VB.Net (par exemple, comment / quand disposer / etc.), ou est-ce que quelqu'un a des conseils spécifiques tirés de son expérience?

Était-ce utile?

La solution

Tout d'abord, vous devez comprendre que le Gestionnaire des tâches vous indique la quantité de mémoire allouée par le système d'exploitation à votre application. Ce n'est pas nécessairement la quantité de mémoire réellement utilisée. Lors du premier démarrage d'une application .NET, le système d'exploitation lui alloue de la mémoire, comme pour tout processus. Le runtime .NET divise ensuite cette mémoire et gère son utilisation. L’exécution peut être considérée comme "gourmande". en ce sens qu'une fois alloué par le système d'exploitation, la mémoire ne lui sera restituée que sur demande expresse du système d'exploitation. Il en résulte que l'utilisation de la mémoire dans le Gestionnaire des tâches n'est pas précise.

Pour obtenir une image fidèle de votre utilisation de la mémoire, vous devez utiliser Analyseur de performances et ajouter les compteurs appropriés.

En ce qui concerne IDisposable et le modèle de disposition, vous ne trouverez probablement pas grand-chose à ce sujet en termes spécifiques à un langage, car il s'agit d'un élément fourni par le .NET Framework lui-même et indépendant du langage. Le motif est le même quelle que soit la langue utilisée, seule la syntaxe est différente.

Plusieurs références disponibles vous donneront des informations sur le fonctionnement de la gestion de la mémoire. J'ai deux articles de blog, l'un qui parle de Utilisation de Garbage Collection dans .NET , qui répertorie les différents ressources J'avais l'habitude de créer deux présentations sur la gestion de la mémoire dans .NET.

La meilleure "règle de base" Si une classe implémente IDisposable , elle le fait pour une raison quelconque et vous devez vous assurer que vous appelez Dispose () lorsque vous avez terminé d'utiliser l'instance. Ceci est plus facilement accompli avec le en utilisant déclaration.

Autres conseils

La gestion de la mémoire dans VB.Net est en fait gérée par le .Net Framework. En général, elle est donc identique à VB.Net et à C #. Cependant, comprendre comment cela fonctionne vous permet de prendre de meilleures décisions en matière de programmation: quand déclarer des variables, quand des objets sont disposés, dans ce contexte, je pense que votre question pourrait être formulée comme suit: "existe-t-il de bonnes sources pour me dire comment coder efficacement?" et pour une plus petite empreinte mémoire "OU", quelqu'un pourra-t-il me dire pourquoi ce truc bizarre se produit ". Il est possible de répondre aux deux questions en expliquant plus précisément comment .Net gère la mémoire, la portée, etc. Il existe des tonnes de ressources pour répondre à cette question,

Cela dit, ce premier lien contient de nombreux autres liens qui pourraient vous être utiles:

http: // geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx

Et ce second point est plus pertinent:

http://www.c-sharpcorner.com/UU /tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx

Si j’étais vous, j’utiliserais tout d’abord un profileur pour voir exactement ce que fait l’application. Il y en 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 où vous devez vous concentrer pour corriger le problème

Ceci n'est pas une réponse à votre question générale, mais vous pouvez envoyer un DataTable directement à un service Web sans l'étape intermédiaire consistant à l'écrire d'abord au format XML. En fait, vous ne pouvez pas envoyer de DataTable, mais vous pouvez envoyer un DataSet (car DataSet est sérialisable alors que DataTable ne l’est pas). Vous pouvez donc envoyer un DataTable directement en le enveloppant d’abord dans un DataSet puis l'envoi du DataSet. Le protocole SOAP convertit quand même le DataSet en XML, vous ne gagnez donc rien en convertissant vous-même le DataTable en XML.

Je suppose que, d'après votre question, vos tables de données sont trop volumineuses pour être envoyées en une seule fois, sinon vous les divisez en parties plus petites pour que votre application client puisse indiquer les progrès à l'utilisateur. Cela peut également être fait sans écrire vous-même le contenu dans XML.

En ce qui concerne votre question générale, il n’est pas surprenant que votre consommation de mémoire augmente parfois de 20 Mo lors de la lecture (et de l’envoi) d’un fichier de 7 Mo. Le code XML utilisé pour décrire un DataTable et son contenu (que vous le fassiez vous-même ou qu'il soit sérialisé automatiquement lorsque vous l'envoyez directement à un service Web) est very verbose.

Pour résoudre ce problème, votre approche la plus efficace consisterait à envoyer les fichiers de données du client directement au service Web (sous forme de tableau à un octet [] ou de séries de tableaux à octets []), puis à les traiter entièrement le serveur. Cette approche minimisera le temps nécessaire pour envoyer chaque fichier au serveur (car l'envoi de 7 Mo nécessite moins de temps que l'envoi de 20 Mo ou même davantage).

Le meilleur livre sur le sujet que j'ai lu est le livre de Jeff Richter, CLR via C #:

http://www.amazon.com/CLR-via-Second-Pro -Developer / dp / 0735621632 / ref = sr_1_1? C'est-à-dire = UTF8 & qid = 1252853101 & amp; sr = 8-1-sort

Si vous voulez une version VB.NET, ils l’ont pour la première édition du livre, mais je ne pense pas qu’il y ait un intérêt suffisant pour traduire le livre en VB.NET pour la deuxième version. Si vous voulez vraiment apprendre .NET, vous devriez vous familiariser avec C #. Dans les deux langues, la mémoire est gérée par le CLR.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top