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

Boost C++ Discussion :

boost tokenize me mange toute ma mémoire vive :(


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 349
    Par défaut boost tokenize me mange toute ma mémoire vive :(
    Bonjour,
    J'ai une classe qui notament parse un fichier afin de récupérer les tokens. La compilation marche bien. Mais l'éxécutable me mange toute ma ram et fini par dire:
    terminate called after throwing an instance of 'std::bad_alloc'
    what(): std::bad_alloc
    Abandon (core dumped)
    Pourtant le fichier a parser et minuscule (pour l'instant je fais des test)
    Citation Envoyé par Le fichier
    R1,(R2 R3),(R4 R5),(R6 R7),(R8 R9),R16,(R18 R12),(R23 -R11),R10,R13,R14,R15,R17,R19,R20,R21,R22,
    La classe posant problème!
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include "Reaction.hpp"
     
    namespace tools
    {
    	Reaction::Reaction(std::wstring newPath) : path(newPath)
    	{
    		// Create flow
    		std::wifstream file(toANSI(path).c_str(), std::ios::in);
     
    		// Current line
    		std::wstring line;
     
    		// typedef for a better readable code
    		typedef boost::tokenizer< boost::char_separator<wchar_t>, std::wstring::const_iterator, std::wstring > tokenizer;
     
    		// The separator
    		boost::char_separator<wchar_t> separator( L"," );
     
     
    		// If open file success
    		if (file)
    		{
    			while (std::getline(file, line))
    			{
    				// While string is not empty
    				while (!line.empty())
    				{
    					// Personal tokeniser
    					tokenizer tokens( line, separator );
     
    					//std::copy( tokens.begin(), tokens.end(), std::back_inserter(reactions) );
    					for (tokenizer::iterator tokenIterator = tokens.begin(); tokenIterator != tokens.end(); ++tokenIterator)
    					{
    						reactions.push_back(*tokenIterator);
    					}
    				}
    			}
    			file.close();
    		}
    		else
    		{
    			std::wcerr << "Error! Can not open file: " << path << std::endl;
    			exit(EXIT_FAILURE);
    		}
    	}
     
    	Reaction::~Reaction()
    	{
     
    	}
     
    	std::wstring Reaction::getPath() const
    	{
    		return path;
    	}
     
    	std::vector<std::wstring> Reaction::getReactions() const
    	{
    		return reactions;
    	}
     
    	std::wstring Reaction::getReactions(int index) const
    	{
    		return reactions.at(index);
    	}
     
    }
    En plus boost::tokenizer n'est pas multi threadé c'est facheux ça me prend qu'un seul proc en entier! Quel gachis

    En vous remerciant de votre aide

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Ben oui,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!line.empty())
    {
      // blabla
    }
    est toujours vrai, donc boucle infinie. (A quoi sert ce while d'ailleurs !?)

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Il a probablement voulu mettre if.

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Oui, bien vu, ça doit être ça.
    Ceci-dit, bioinfornatics, le if ne servirait à rien non plus
    Le code suivant suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (std::getline(file, line))
    {
       // Personal tokeniser
       tokenizer tokens( line, separator );
       reactions.insert(reactions.end(), tokens.begin(), tokens.end());
    }
    Si line est vide, tokens sera vide aussi et insert() ne fera rien.

  5. #5
    Membre très actif

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 349
    Par défaut
    ah oki, grand merci a vous j'aurais jamais trouvé.
    Très grand merci

    Et peut on connaitre le numéro du token ?
    Par exemple c'est le 2ème token trouvé dans la ligne? etc...

    je me répond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while (std::getline(file, line))
    {
         // Personal tokeniser
         tokenizer tokens( line, separator );
     
         for (tokenizer::iterator tokenIterator = tokens.begin(); tokenIterator != tokens.end(); ++tokenIterator)
         {
             std::string tempString = *tokenIterator;
             matrix(column, row) = atoi( tempString.c_str() );
             column++;
          }       
          row++;
    }

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    utilise BOOST_FOREACH plutôt que for+iterator c plus light

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/04/2014, 14h59
  2. Réponses: 1
    Dernier message: 17/03/2006, 00h19
  3. Processus Sql Server prend toute la mémoire vive
    Par cracosore dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 19/02/2004, 17h53
  4. [API] mémoire vive
    Par Halleck dans le forum Windows
    Réponses: 8
    Dernier message: 29/01/2004, 00h17
  5. Utilisation de la mémoire vive....
    Par Neilos dans le forum Windows
    Réponses: 9
    Dernier message: 24/11/2003, 11h09

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