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

SL & STL C++ Discussion :

Probleme desesperant avec une classe heritant de std::multimap


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut Probleme desesperant avec une classe heritant de std::multimap
    Bonjour,

    Developpeur dans une grosse compagnie, on m'a demande il y a une semaine d'intervenir sur un logiciel developpe en interne, execute en batch toute les nuits, qui s'est mis subitement a crasher.

    Celui-ci a ete developpe en C++ sous Visual Studio, je ne sais quelle version a l'epoque, mais aujourd'hui je le debug sous VS 2003 / windows XP.

    J'ai isole la ligne du programme qui genere une exception, mais qui est executee des milliers de fois avant de planter. Cela survient sur l'execution de la methode "insert" sur une multimap.

    Voici le code ou est definie ma multimap:
    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
    53
    54
     
    #include <map>
     
    #include "CDate.h"
     
    class CleRef
    {
    	public :
     
    	int		Type;
    	char	Signature[80];
     
    	public :
     
    	CleRef(int aType, long aRef1)
    	{
    		Type=aType;
    		sprintf(Signature,"%ld",aRef1);
    	}
     
    	~CleRef() {}
     
    	bool operator < (const CleRef& cle) const
    	{
    		if (Type==cle.Type) return std::string(Signature) < std::string(cle.Signature);
    		else return Type<cle.Type;
    	}
    };
     
    class PointRef
    {
    	public :
     
    	int		Dim;	// dimension de l'espace des données
    	double  limite;
    	CDate	maDate;
    	double  valeur;
     
    	PointRef(int aDim, double aValeur = 0.0) { Dim=aDim; valeur=aValeur; limite=0.0; }
    	PointRef(int aDim, double aValeur, long aDate, double aLimite = 0.0) { Dim=aDim; valeur=aValeur; maDate = CDate(aDate); limite= aLimite;}
    	~PointRef() {}
     
    };
    // *************************************************************************************
    // Structure d'ensemble de reference a des donnees de marche
    // *************************************************************************************
    class CustomMM : public std::multimap<CleRef, PointRef>
    {
     
    	public :
     
    		CustomMM() {};
    		~CustomMM() {};
    };
    Et voici ou elle est utilisee:

    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
    void MonContext::SauveValeur(long code, double valeur) const
    {
    	const CleRef cleRef(1, code);
    	PointRef point(0, valeur);
    	CustomMM::value_type value(cleRef, point);
     
    	try
    	{
    		//La variable _pBuffer a ete initialisee auparavant et pointe vers un objet de type CustomMM
    		_pBuffer->insert(value);
    	}
    	catch (exception ex)
    	{
    		//Affichage message d'erreur
    	}
    	catch (...)
    	{
    		//Affichage message d'erreur
    	}
    }
    En gros dans le programme on boucle 18000 fois, a chaque iteration on fait ceci (en tres gros resume)

    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
     
    {
    	CustomMM * customMM = new CustomMM();
    	MonContext * monContext = new MonContext();
    	monContext->SetBuffer(customMM);
    	for (i=0; i<1000 ; i++)
    	{
    		long currentCode = GetCode(i);		//Fonction qui renvoie un code unique a chaque fois
    		long maValeur = GetCurrentValeur(i);
     
    		//##########################
    		//Ligne qui crashe lors de la 489 nieme iteration sur le 18197 ieme MonContext cree
    		monContext.SauveValeur(currentCode, maValeur);
    		//############################
    	}
     
    	//Sauvegarde de monContext dans une map
    	...
    }
    Voila je ne sais pas si j'ai ete tres clair mais il n'est pas evident de resume le probleme en un simple post.
    Je suis aussi conscient de la non-lisibilite du code (ce n'est pas le mien hein je precise ;-) *sifflotte*)

    Si je resume le probleme voici ce qui se passe

    (boucle 19000 fois)
    {
    Creation d'une nouvelle multimap via un pointeur (donc allocation memoire)
    (boucle 500 fois)
    {
    Insertion dans la multimap
    }
    }

    ==> Ca crashe lors de la 489 ieme insertion dans ma 18197 ieme multimap ! :-(


    Tout ce post pour en venir a ma question : je me demandais s'il y avait certaines limites techniques, ou de performances, connues, a la multimap ?
    Ou plus generalement, est ce que quelqu'un aurait une idee pour me sortir de ce mauvais pas ?

    Merci par avance a la communaute,

    Guyzeug.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Les multimap sont-ils correctement libérés (delete) ?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    Les multimaps sont liberees bien plus loin dans le programme, mais la mon probleme est de remplir les 19000 multimaps sans crasher, pour pouvoir inserer leur contenu dans une base de donnees par la suite.

    Il faudrait revoir completement le programme et la facon de faire, sur le fond, mais pas assez de temps, je dois "simplement" corriger le bug le plus rapidement possible "dixit le boss".

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Si les multimap existent en même temps alors le problème vient sûrement d'un Out Of Memory. 19000 multimap de 500 éléments cela fait environ 1Go !

  5. #5
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    Je n'ai pas tres bien compris Sylvain, comment obtiens en calculant le 1Go ?

    D'autre part 1Go est-elle une limite pour les multimaps ? Car en faisant tourner le programme sur ma machine, qui a 2Go de RAM, ou sur une machine qui a 3go de RAM j'ai le meme probleme, c'est pourquoi j'ai pense a une limitation de la structure multimap elle-meme.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    Ok c'est bon j'ai resolu mon probleme, sans etre vraiment sur a 100% d'ou provenait le crash.

    J'ai remplace dans la cle le char[80] par une std::string, afin de gagner de la place en memoire, et ca a marche.

    Ca confirmerait donc la theorie de l'explosion memoire, mais je ne comprends toujours pas pourquoi par exemple sur une machine avec 3Go de RAM a ne passait toujours pas, alors que le process n'excedait pas 1,8 Go d'apres le Task Manager.

    Limitation des maps ? limitation du systeme d'exploitation ?

    Je ne le saurai jamais, mais je suis bien content d'avoir resolu ce probleme et de retourner a mon code C#

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

Discussions similaires

  1. Probleme avec une class qui traite la date
    Par tarikmahf dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/11/2008, 22h12
  2. Probleme avec une classe d'association
    Par bassim dans le forum UML
    Réponses: 7
    Dernier message: 18/04/2007, 14h42
  3. problem de vector avec une classe
    Par potterthekiller dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/03/2007, 11h11
  4. [débutant] probleme avec une classe arbre
    Par go_all_in dans le forum C++
    Réponses: 17
    Dernier message: 08/06/2006, 10h33
  5. Probleme avec une class template
    Par lenectar dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2006, 10h49

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