IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Problème libérer de la mémoire DataSet DataTableAdapter


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut Problème libérer de la mémoire DataSet DataTableAdapter
    Bonjour!

    J'ai un gros problème de mémoire dans une application développé sous VB.NET 2008

    Par exemple, ma fenêtre principale s'ouvre, après la fenêtre d'identification l'application prend 36mo. Jusque la je trouve déjà que c'est pas mal, mais ça me dérange pas.

    J'ouvre un module, une seconde fenêtre à partir de la première

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim frm as new MaForm
    frm.showdialog
    frm.dispose
    Dans cette fenêtre, il y à différent objets dont un DataSet fortement typé et quelque TableAdapteurs qui chargent des tables du DataSet dans le FormLoad

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.MonTableAdapter.Fill(Me.DataSet.MaTable)
    L'application monte à 84mo. pour le chargement de 40000 occurrences.

    Le problème est que lorsque je quitte la fenêtre, l'application conserve 84mo. et si j'ouvre la fenêtre de nouveau je suis rendu à 124mo. et ça continue!

    Comment libérer cette mémoire !?

    J'ai essayer de mettre dans le formClosing des trucs du genre, mais ça ne libère aucune mémoire... Jusqu'au moment ou j'obtien un System.OutOfMemory exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MonTableAdapter.Dispose()
    MonTableAdapter = Nothing
    DataSet.MaTable.Dispose()
    DataSet.Dispose()
    DataSet = Nothing
    Merci!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 80
    Par défaut
    Bonjour,

    La mémoire nécéssaire pour l'application est managé par le garbage collector qui alloue les espaces nécéssaire. Dès que tu fais un dispose sur un objet, il ne libère pas immédiatement la mémoire, il ne le fait que au moment ou le garbage collector effectue une tâche d'allocation de mémoire.

    Essaie de ne pas faire le dispose de tes objets uniquement au moment ou tu quitte ton programme mais déja dans les fonctions qui les utilisent.

    Par exemple si tu as une fonction pour remplir ton dataset, tu auras certainement un objet de connection DB, un dataadapter et ton dataset.
    Après avoir fait ton fill sur ton dataadapter, il te faut déja faire un dispose sur l'objet connection et dataadapter, idéalement tu peux le faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Try
    ' Code pour remplir le dataset
    Catch ex as exception
     
    Finnaly
    IF NOT MaConnection IS NOTHING
      MaConnection.close()
      MaConnection.Dispose()
    END IF
    IF NOT MonAdapter IS NOTHING
      MonAdapter.Dispose()
    END IF
    END Try
    Personnellement, je le fais systématiquement sur les objets que je n'utilise pas ultérieurement. Evidement le dataset qui lui est utilisé plus loin ne peux être disposé que après son utilisation.

    ça permettra de renseigner le garbage collector que ces objets peuvent être libéré de la mémoire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Mais normalement, si je fais un GC.Collect, la mémoire devrait revenir!? Pour le moment, ce n'est pas le cas

    Sinon, si le collecteur fais bien sont travail, après combien de temps il devrait passer?

    Merci

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Par défaut Bonjour,
    J'ai trouvé ça sur la msdn...la traduction automatique est un peu foireuse mais c'est a peu près explicite:


    Les classes héritées de DataSet ne sont pas finalisées par le garbage collector, car le finaliseur a été supprimé dans DataSet. La classe dérivée peut appeler la méthode ReRegisterForFinalize dans son constructeur pour permettre à la classe d'être finalisée par le garbage collector.
    A plus

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Donc voilà!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DataSet.Clear()
    DataSet.Dispose()
    GC.Collect()
    Je crois que ça fonctionne. Peut-être que le GC.Collect() n'est pas nécessaire, mais je ne sais pas à quelle intervalle il passe...

    Merci !

Discussions similaires

  1. Comment libérer l'éspace mémoire utilisé par Acrobat Reader?
    Par Matt2094 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/03/2006, 17h48
  2. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  3. [VB.NET][dataset] libérer de la mémoire
    Par JauB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/01/2006, 12h58
  4. Réponses: 3
    Dernier message: 08/12/2005, 10h38
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo