Problème de gestion de la memoire - stockage de données 3D lues dans un fichier

Signaler
Messages postés
34
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
29 octobre 2009
-
Messages postés
34
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
29 octobre 2009
-
Bonjour à tous,

je vous contacte car j'ai un gros problème de gestion de la mémoire. voici mon contexte. j'ai implémenté une application qui sert a visualiser en 3D des points, courbes et surfaces. pour cela j'ai créé une classe parser, une classe static container (avec en données mebre static listepoints,listecourbes & listesurfaces), et une classe viewer. j'ai aussi des classes d'objets geometriques comme point (avec en donnée membre nom, X, Y, Z).

j'ai un fichier contenant 8700 points environs. en construisant ma liste de points je remplis deja presque 600Mo de Memoire !

avez vous une piste pour commencer à creuser ce soucis ???

dites moi de quelle partie du code vous avez besoin pour identifier le pb.

merci encore pour votre aide.

bonne soiree

3 réponses

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Effectivement, sans code, ça va être dur de t'aider.

Néanmoins, pour avoir 600Mo de mémoire prise, c'est que tu fais forcément de la duplication en mémoire.
- Vérifie que lorsque tu passes des arguments, tu les passes par références et non par copie
- Vérifie que tu ne fais pas de concaténation de std::string, mais que tu utilises bien un stringstream.
- Utilise le partage de mémoire pour des objets similaires (voir design pattern flyweight)

Si ton application n'est pas trop grosse, je serais curieux de voir les classes conteneurs, et les méthodes qui les manipulent.
Messages postés
34
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
29 octobre 2009

Ok je vais verifier tes premieres pistes.

je t'envoie les source incrimines des que je peux.

merci pour ton aide
Messages postés
34
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
29 octobre 2009

voici ma classe conteneur :

#include "SOFGeometryContainer.h"

std::vector <SOF3DControlPoint> SOFGeometryContainer::_ListOfControlPoints;
SOF3DBoundingBox SOFGeometryContainer::_ContainerBoundaries;
std::vector <SOF3DNURBSCurve> SOFGeometryContainer::_ListOfCurves;
std::vector <SOF3DNURBSSurface> SOFGeometryContainer::_ListOfSurfaces;
bool SOFGeometryContainer::_IsContainerDirty;

SOFGeometryContainer::SOFGeometryContainer(void)
{
_IsContainerDirty = false;
}

SOFGeometryContainer::~SOFGeometryContainer(void)
{
_ListOfControlPoints.clear();
}

int SOFGeometryContainer::Add3DControlPoint(const SOFString &iCPName, const double & iCPx, const double & iCPy,const double & iCPz)
{
SOF3DControlPoint CP;
CP.SetName(iCPName);
CP.SetX(iCPx);
CP.SetY(iCPy);
CP.SetZ(iCPz);
_ListOfControlPoints.push_back(CP);
_ContainerBoundaries.UpdateBoxWithPosition(iCPx,iCPy,iCPz);
_IsContainerDirty = true;
return 0;
}

int SOFGeometryContainer::Add3DNURBSCurve(SOF3DNURBSCurve iCurve)
{
_ListOfCurves.push_back(iCurve);
return 0;
}

int SOFGeometryContainer::Add3DNURBSSurface(SOF3DNURBSSurface iSurface)
{
_ListOfSurfaces.push_back(iSurface);
return 0;
}

int SOFGeometryContainer::GetContainerBoundaries(SOF3DBoundingBox &oContainerBoundaries)
{
oContainerBoundaries = _ContainerBoundaries;
return 0;
}
int SOFGeometryContainer::Get3DControlPoints(std::vector <SOF3DControlPoint> *&opListOfControlPoints)
{
if(_ListOfControlPoints.size()>0)
opListOfControlPoints = &_ListOfControlPoints;
else
opListOfControlPoints = NULL;
return 0;
}
int SOFGeometryContainer::Get3DCurves(std::vector <SOF3DNURBSCurve> *&opListOfCurves)
{
if(_ListOfCurves.size()>0)
opListOfCurves = &_ListOfCurves;
else
opListOfCurves = NULL;
return 0;
}
int SOFGeometryContainer::Get3DSurfaces(std::vector <SOF3DNURBSSurface> *&opListOfSurfaces)
{
if(_ListOfSurfaces.size()>0)
opListOfSurfaces = &_ListOfSurfaces;
else
opListOfSurfaces = NULL;
return 0;
}
int SOFGeometryContainer::Find3DControlPointFromName(const SOFString iName, SOF3DControlPoint *& o3DControlPoint)
{
if(true==iName.IsEmpty())return -1;
o3DControlPoint = NULL;
for(unsigned int i=0;i<_ListOfControlPoints.size();i++)
{
SOFString CurrentName;
int rc = _ListOfControlPoints.at(i).GetName(CurrentName);
if(0!=rc)return rc;
SOFString InputName = iName;
if(01)
{
if(ListOfSubStrings.at(0)==SOFString("CARTESIAN_POINT"))
{
if(ListOfSubStrings.size()==5)
{
if(ListOfSubStrings.at(1)==SOFString("'Control Point'"))
{
//Positions 3,4 & 5 are the coordinates
int rc = SOFGeometryContainer::Add3DControlPoint(STemp,
ListOfSubStrings.at(2).ToDouble(),
ListOfSubStrings.at(3).ToDouble(),
ListOfSubStrings.at(4).ToDouble());
}
}
}

ensuite dans le redraw de ma scene je recuere la liste des controls points mais sur mon modele la memoire est deja pleine avant .....

desolé pour le delai ...

merci de ton aide