Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimiser la récupération des données par ifstream

    20 avril 2008 à 20:54:29

    Salut à tous ^^

    Alors voila je suis un peu embêté : j'ai optimisé une de mes biblios (pour ceux qui me connaissent et qui la connaissent, j'en suis à la version 2.1, la 2.0a et 2.0b n'étant que des bêtas), qui doit charger des données se trouvant dans un document .OBJ. Je dois charger les données assez spécialement (tout dépend du caractère de début de ligne en fait ^^ ). Par exemple si le caractère vaut v, alors je charge toute la ligne etc etc ... (je simplifie ENORMEMENT :D )

    La biblio fonctionne très bien, mais je trouve le chargement relativement long (~15 secondes pour charger 5 Mo de texte, alors que 3Ds max ne met même pas 1 seconde ...).

    Donc j'ai pensé à un truc : pour l'instant j'utilise ifstream::get(char) ainsi que ifstream::operator<<(). j'ai entendu parler d'une alternative qui consiste à directement passer l'ifstream dans un "buffer", un tampon, qui connait ? Qui peut m'en parler ? Merci ^^
    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2008 à 21:04:48

      je ne connais pas assez le format .obj pour parler optimisation, mais les buffers c'est std::streambuf (et ses derivations). tu peux mettre tout le contenu de ton fichier dans un std::(i)stringstream, et lire ce dernier en parsant le contenu de la facon la plus direct possible
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        20 avril 2008 à 22:52:52

        Si tu veux récupèrer otut le contenur d'un fichier en une seule fois dans une std::string, ce code te conviendra:
        #include <string>//pour les string
        #include <fstream>//pour ifstream
        #include <sstream>//pour stringstream
        #include <iostream>//pour le cout
        
        using namespace std;
        
        int main(int argc, char **argv) {
            
            const string file = "fichier.txt";
        
            string data = "";
        
            ifstream mfile(file.c_str()); //ouverture du //fichier
            
            if (!mfile) data = "erreur";
            else
            {
        
                stringstream buffer;
        
                // lecture de tout le fichier
                buffer << mfile.rdbuf();
        
                // fermeture du fichier
                mfile.close();
        
                // recuperation du contenu dans un string
                data = buffer.str();
            }
            
            cout << data << endl;
            
            return 0;
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2008 à 23:38:03

          Ok merci beaucoup j'essaie ça et je vous tiens au courant !

          ^^
          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2008 à 16:46:01

            Je me suis rendu compte que j'ai besoin d'avoir le résultat que ifstream::operator>>() fournit, car sinon je vais devoir écrire des fonctions (que je sais écrire) qui vont allourdir le code, comme la transformation d'une série de char en un seul int etc ... Donc c'est assez génant o_O
            • Partager sur Facebook
            • Partager sur Twitter
              23 avril 2008 à 18:17:45

              j'ai pas trop compris ton probleme, <sstream> permet ce que tu dit
              • Partager sur Facebook
              • Partager sur Twitter
                23 avril 2008 à 21:16:32

                Mon loader d'obj est assez lent pour charger un .obj, et je pense que cela est du au fait que je lis via ifstream::get(char), ifstream::operator>>() et getline(). J'aimerai pouvoir éviter un tel temps de "download" du document dans la ram (j'utilise des vectors).
                • Partager sur Facebook
                • Partager sur Twitter
                  24 avril 2008 à 17:25:22

                  essaye de revoir ton algo d'importation, ou regarde du coté des iterateurs de flux couplé avec les algos de la SL

                  ps: ce ne sont que des propositions, je ne dis que ce qui me passe par la tete
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 avril 2008 à 17:34:50

                    Je l'ai revu et ça va beaucoup mieux, mais pourrais-tu me renseigner sur les "iterateurs de flux couplé avec les algos de la SL" ? Merci à toi ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 avril 2008 à 17:44:41

                      premierement savoir ce qu'est un iterateur, pour ceux des flux il y a un exemple dans la FAQ de developpez ( http://cpp.developpez.com/faq/cpp/?pag [...] eam_iterators )
                      mais comme je te l'ai dit, je n'ai dis ca que comme ca, je ne connais pas le contenu d'un .obj et je ne sais pas si un couplage iterateur/algo/predicat est utile
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Optimiser la récupération des données par ifstream

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown