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 :

Problème de mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Problème de mémoire
    Bonjour à tous,


    J'ai un programme qui se charge de charger des données stockées dans une base de données pour les stocker dans des objets en mémoire.
    A la fin du programme, je calcul auprès de mes gestionnaire la taille utilisée des objets stockées (sizeof(T) * Ges<T>.getCount()), où T peut-être un client, un véhicle, enfin bref, un objet metier.
    J'ai également un gestionnaire de mémoire qui possède une map référençant les pointeurs avec leur bloc de données contenant notemment la taille allouée pour chaque pointeur.

    Je n'ai pas d'IHM, mon programme est une console, en dehors de mes objets métiers, j'ai 4 gestionnaires qui ne stockent quasiment rien (Un gestionnaire de configuration, un gestionnaire de log, un gestionnaire IO, et le gestionnaire de mémoire, désactivé en debug).

    Et tous mes objets metier sont stockés dans des vectors, sous forme de pointeur. Après chargement, j'ai 241852 pointeurs stockés dans ces vectors.
    Ca bouffe quelle taille un pointeur ?

    Après quelques tests, je relève ces données :
    Debug :
    - Utilisation des objets metiers : 393,94Mo
    - Utilisation de la mémoire calculée par le gestionnaire de mémoire : 393,95Mo
    - Utilisation de la mémoire indiqué par le gestionnaire de processus Windows : 1 217Mo

    Et en Relase (exécution de l'exe directement, sans passer par VS)
    - Utilisation des objets metier : 257,703Mo
    - Le gestionnaire de mémoire est désactivé
    - Utilisation de la mémoire indiqué par le gestionnaire de processus Windows : 515,10Mo

    Comment expliquer cette utilisation de mémoire indiqué par le gestionnaire Windows comme 3 fois plus que calculée dans mon programme en debug et 2 fois plus en Release ?

    Peut-t-on réduire ça ?


    Merci

    A bientôt

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    C'est parcequ'en debug il y a des informations sur tes données qui prennent énormément de place.

    Pour la taille du pointeur, si tu veux être sur, fait un sizeof


    Au passage, tu devrais plus t'inquiéter de la taille de ce qui est pointé que des pointeurs...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9
    Par défaut
    Salut à tous,

    Une petite précision concernant la gestion de la mémoire. Si je ne dis pas de bétise, lorsque tu stockes en mémoire un objet, Windows le met en mémoire et ajoute d'autres informations qui lui seront utiles comme le prochain bloc mémoire libre. Cela peut expliquer pourquoi Windows affiche une consommation mémoire bien supérieure.

    Une possibilité de réduire la mémoire utilisée par Windows est d'utiliser les pools de mémoire (en fait tu alloues une grosse quantité de mémoire que tu utilises ensuite à ta guise).

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'ai juste une question....

    Si tu désactives ton gestionnaire mémoire, comment fais tu pour savoir les parties occupées par ton programme ?

    Parceque des trucs comme les std::String font des tas d'allocation derrière ton dos, et si tu ne les track pas.....
    Enfin bref, si tu overrides pas les new/delete/malloc/free je vois mal comment tu peux tracker la mémoire..

    Une astuce qui ne demande pas d'intégrer un (couteux ?) analyseur d'utilisation mémoire: compile en release, mais avec la std.lib de debug. Et utilises les fonctions de debug memoire (dépend du compilo).

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Merci pour vos réponses.

    En fait je charge des données de la base de données. A la fin du chargement, je fais le calcul sizeof(class1) * nb1 + sizeof(class2) * nb2 etc...
    C'est pour ça que j'arrivais à déduire l'utilisation mémoire de mes objets chargés sans gestionnaire de mémoire.

    En debug, le gestionnaire est activé, c'était pour confirmer mon calcul.

    J'ai calculé l'ensemble des pointeurs, ça fait 1mo, donc c'est pas ça.

    Je pense bien que ce sont les std::string qui bouffent pas mal de place. Car lorsqu'on fait sizeof(Class1), si un objet possède un string de 50 caractères et un autre 3 caractères, les deux ne prendront pas que sizeof(Class1) de mémoire

    Ca ne peut venir que de là car mes autres données sont centralisées au niveau des gestionnaires de données, qui sont unique pour un type de données.
    Par gestionnaire j'ai... une centaines d'octets pris pour configurer les données qu'il doit gérer et j'ai une 40ène de type de données à gérer, donc ça ne peut pas être ça.


    C'est possible de connaître la taille d'un objet en prenant en compte sa charge ? C'est pour refaire le calcul en utilisant sizeof(objn) plutôt que sizeof(class) mais il me semble que les deux renvoient la même valeur.


    'fin j'essayerai


    Merci

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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