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

C# Discussion :

Libérer de la mémoire


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut Libérer de la mémoire
    Bonjour,
    Mon programme utilise des datasets et donc me bouffe pas mal de mémoire.
    Je voudrais pouvoir libérer la mémoire prise par les datasets qui ne me servent plus mais je ne sais pas comment faire.
    J'ai déjà essayé dataset.Dispose() mais apparement ça ne la libère pas tout de suite donc mon programme plante au bout d'un moment faute de mémoire.
    Là je suis en train d'essayer dataset = null mais je ne sais pas si ça marche.

    Si quelqu'un peut m'aider ça serait sympa.

  2. #2
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    Citation Envoyé par jeremy_d
    mon programme plante au bout d'un moment faute de mémoire.

    C'est "normal" que t'es un plantage par manque de memoire ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Désolé, je ne comprends pas le sens de ta question

  4. #4
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    Est-ce vraissemblable que tes datasets arrive a remplir ta memoire ?
    Est-ce que le probleme ne pourrait pas etre autre part ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Je ne sais pas, mais il me semble que c'est ça.
    le message d'erreur est "OutOfMemory Exception"

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Par défaut
    Si tes dataset sont remplis a partir d'une bdd.

    Tu pourrais peut etre essayer d'optimiser tes requetes pour qu'elles ne renvoyent qu'un nombre limite de row.
    (si ta bdd possede 1 million de ligne il y a des chances que ton dataset soit enorme).

    En plus ca veut dier que ton gc n'a pas el temps de faire son boulot.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    En fait j'ai un dataset de départ qui est rempli à partir d'un fichier excel, j'ai qu'une seule table de 20 colonnes et environ 475 000 lignes.
    Puis ensuite je coupe se dataset en deux à partir d'un seuil.
    J'ai donc deux nouveaux datasets de 20 colonnes mais avec des nombres moins importants de ligne et je redécoupe récursivement tous les nouveaux datasets.
    Et donc voilà si je les vire pas de la mémoire au bout d'un moment ça explose.

  8. #8
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    Tu peux faire un Dispose pour tes datasets; mais je pense comme Tober que tu devrais voir ailleurs! explique ce que fais ton projet...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    J'ai déjà essayé les .Dispose() mais ça ne marche pas, ça ne me libère pas la mémoire ou alors ça plante avant...
    Mon projet construit un arbre de décision, je ne sais pas si vous voyez ce que c'est ?

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Par défaut
    oui,

    475 000 lignes c'est deja enorme. Perso j'ai un fichier excel de 15 000 lignes que je charges comme ca et deja ca me prend un temps enorme de traitement.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Ah bin non par contre pour le charger moi c rapide, ça doit mettre 15 secondes.
    ma procédure de chargement c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public void LoadFile()
            {
                OpenFileDialog ofn = new OpenFileDialog();//création d'une boîte de dialogue permettant de choisir le fichier
                ofn.Filter = "Fichiers Texte (*.txt)|*.txt";//filtre permettant d'afficher uniquement les fichiers textes
                ofn.Title = "Choix du fichier de données";//titre de la boîte de dialogue
                if (ofn.ShowDialog() == DialogResult.OK)
                {
                    m_fichier = ofn.FileName;//quand l'utilisateur click sur OK, le chemin du fichier est stocké dans la variable fichier
                    try
                    {
                        LoadingFileEnded(this, new LoadDataEndedEventArgs());
                    }
                    catch (NullReferenceException) { }
                    return;
                }
                else      
                    return;     
            }
     
            /// <summary>
            /// Méthode permettant de charger les données dans le dataset
            /// </summary>
            public void LoadData()
            {
                //récupération du nom du répertoire dans lequel se trouve le fichier
                string nom_repertoire = m_fichier.Substring(0, m_fichier.LastIndexOf("\\"));
                //Création de la connexion oledb à la source de données
                OleDbConnection connectionProvider = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;data source=" + nom_repertoire + ";Extended Properties=\"text;HDR=Yes;FMT=TabDelimited\"");
                //Récupération du nom du fichier
                string nom_fichier = m_fichier.Substring(m_fichier.LastIndexOf("\\") + 1);
                //Requête permettant de sélectionner toutes les données du fichier texte sélectionné
                string requete = "select * from " + nom_fichier;
                OleDbDataAdapter ThisCommand;
                //Commande permettant l'exécution de la requête
                ThisCommand = new OleDbDataAdapter(requete, connectionProvider);
                m_dataSet = new DataSet();
                //Remplissage du dataset à partir du résultat de la requête
                ThisCommand.Fill(m_dataSet);
                connectionProvider.Close();
                try
                {
                    LoadingDataEnded(this, new LoadDataEndedEventArgs());
                }
                catch { throw; }
            }

  12. #12
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    J'ai une solution : Achete de la RAM
    Non serieusement, je pense que tu devrais revoir ton probleme differement.
    D'apres ce que j'ai compris de ton arbre de decision, tu decoupes ton dataset en plusieurs autres...

    Serait-il possible de creer tes sous-arbres grace aux requetes directement ? et donc ne charger qu'une partie de tes donnees, comme ca, tu les traite, tu les sauvegardes et tu les vires de la memoire...

    Ou alors, lit les x premieres lignes, traite les comme tu veux pour creer ton arbre, sauvegarde et recommence avec les x prochaines. Et ensuite tu regroupe couple de neouds par couple.

    C'est cool ton probleme me rappelle mes cours d'algo

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 49
    Par défaut
    D'après ce que tu dis à chaque dichotomie tu appelle dispose() sur le dataset parent. Donc, ta quantité d'infos en mémoire devrait rester constante.
    As tu essayé de vider ton dataset avant d'appeller dispose (avec clean() )?

  14. #14
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Donc, ta quantité d'infos en mémoire devrait rester constante.
    Non, la mémoire n'est pas libérée de suite. Faut le temps que le garbage collector passe par là et fasse le ménage.


    Ouais donc en gros si ton processus a 20 étapes, tu vas créer au total 20 * 475000 DataRows, ce qui est, ahum, trop.

    Plutôt que dédoubler tes rows, tu peux te contenter de stocker leurs identifiants.

  15. #15
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par Tober Voir le message
    Serait-il possible de creer tes sous-arbres grace aux requetes directement ? et donc ne charger qu'une partie de tes donnees, comme ca, tu les traite, tu les sauvegardes et tu les vires de la memoire...
    ++

    Sinon, tu peux aussi essayer d'appeler des GC.Collect a des endroits choisis

    Sinon, pour ce genre de pb, essaye dans un premier temps de tracer en manuel tes quantités de mémoire, sinon, essaye un petit profiler, ça devrait t'aider

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

Discussions similaires

  1. Libérer de la mémoire en vidant des variables images
    Par PoZZyX dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/02/2008, 11h28
  2. Comment libérer de la mémoire ?
    Par dam2p dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/08/2007, 23h05
  3. Réponses: 7
    Dernier message: 06/06/2006, 15h38
  4. 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
  5. [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

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