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 :

Tableau et mémoire


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 257
    Par défaut Tableau et mémoire
    Voilà le problème:J'ai un tableau qui s'initialise au lancemement du prog.Par la suite il s'initialise à nouveau en modifiant sa taille ou en la conservant.Mais j'ai un petit problème de mémoire que je n'ai pas avec delphi.Quand je change sa taille la 1ère fois le gestionnaire de tâches de windows me montre bien qu'il a créé les entrées (+32mo).Au 2ème passage(click du le bouton) en gardant le même nombre d'entrées la ram ne devrait pas changer mais le gestionnaire me rajoute +32mo.Les fois suivantes cela rentre dans l'ordre car la ram ne change plus de taille (en gardant le même nombre d'éléments avec "new").Voici une version simplifiée:
    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
    46
    47
    48
    49
    50
    51
    52
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsApplication2
    {
        public partial class Form1 : Form
        {
            private static TV[] T;
     
            private struct TL
            {
                private Byte a, b, c;
            }
     
            private struct TV
            {
                private UInt32 a;
                private SByte b;
                private Int16 c;
                private SByte d;
                private TL e;
                private Byte f;
            }
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {//init:gestionnaire des tâches à 637mo
                ModifSize(32);
     
            }//ici le gestionnaire des tâches indique 669 (+32mo):normal
     
            private void button1_Click(object sender, EventArgs e)
            {
                ModifSize(32);//1er click:gestionnaire des tâches à 669mo
            }//ici le gestionnaire des tâches indique 701 (+32mo):anormal
            private void ModifSize(UInt32 Size) 
            {
                UInt32 Entries = Convert.ToUInt32((Size * 1024) * 1024 / 17);
                T = new TV[Entries];
     
            }
        }
    }
    J'ai mis des points d'arrêts à l'endroit des commentaires.
    Par la suite lors des clicks sur le bouton la ram ne bouge plus.Donc je voudrais savoir pourquoi le programme occupe 64mo en mémoire alors qu'il ne devrait en occuper que 32mo?
    Merci de m'éclairer.

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Je suis pas bien sur d'avoir compris.

    Mais lors de ton 2ème new, les 32 éléments crées précédemment sont encore dans la mémoire mais plus rien ne pointe dessus, ils seront simplement supprimés lorsque le GC fera un petit passage.

    Donc lorsque tu fais ton second new c'est normal que 32Mo de plus soit pris.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 257
    Par défaut
    Merci pour ta lumière.
    Y a t-il un moyen donc de forcer le GC à libérer cette mémoire non pointée car
    si au lieu de 32mo j'alloue 500mo ça rique de poser des problèmes avec le système(d'ailleurs j'ai un outofmemory avec 500mo car j'ai 1go de ram).Si on regarde de près,le prog restera à 701mo donc on passe de 637 à 701 donc ces 32 premiers megas ne sont pas récupérés par le GC.
    Merci.

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    plutôt que redimensionner le tableau à chaque fois, est-ce qu'il ne serait pas plus simple d'utiliser une collection ?
    A lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private static TV[] T;
    ...
    T = new TV[Entries];
    Tu pourraisfaire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private static List<TV> T;
    ...
    T = new List<TV>();
    De cette façon la taille est modifiée dynamiquement quand tu ajoutes des éléments dans la liste (tu n'as donc plus besoin de la fonctionModifSize...)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    j'appuie le propos de Tomlev, si tu n'as pas forcement besoin d'un tableau et que ta collection change de taille, utilise une List<>.

    Sinon es tu sur que tu n'as pas une reference qui traine sur ton array et qui empecherai sa liberation ? Essaie toujours un GC.Collect() apres le changement de tableau, si il ne libere pas, c'est surement une reference ailleurs dans le programme.

    Bon courage.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 257
    Par défaut
    Merci ,c'est parfait avec ca:
    T = new TV[Entries];
    GC.Collect();

    C'est quand même bizarre qu'avec un système dit 'managé' ("la gestion de la mémoire se fait sans que le programmeur s'en occupe)(pointeurs,destructeurs...) ") on doit mettre la main dans le cambouis.
    Merci pour tes réponses claires et précises.

    Salutations.

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Normalement tu n'es pas censé t'occuper du GC, il est appelé, euh comment dire, parfois pour libérer la mémoire. A vrai dire je ne sais pas quand est-ce qu'il est appelé mais bon moi je n'ai jamais eu à l'appeler.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 257
    Par défaut
    Salut tomlev.

    Non , dans mon cas il faut que j'initialise un tableau de plusieurs milliers d'éléments (une hashtable) et non de rajouter des éléments à la volée.
    Merci quand même de ton aide.

    Salutations.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau de mémoire partagée
    Par sikin1989 dans le forum Débuter
    Réponses: 8
    Dernier message: 04/12/2010, 17h16
  2. [Tableaux] Persistance d'un tableau en mémoire vive
    Par redkan dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2009, 14h00
  3. Utiliser un DBGrid avec un tableau en mémoire
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 04/08/2009, 15h04
  4. Créer un tableau en mémoire, puis l'afficher
    Par patbeautifulday1 dans le forum Général VBA
    Réponses: 2
    Dernier message: 29/02/2008, 09h57
  5. Tableau en mémoire partagée
    Par jchenoy dans le forum C
    Réponses: 5
    Dernier message: 05/11/2007, 11h58

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