-
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
-
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...
-
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).
-
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).
-
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 :)