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

C++ Discussion :

Chargement d'un grand nombre d'instances rapidement.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15
    Par défaut Chargement d'un grand nombre d'instances rapidement.
    Bonjour,

    je n'ai pas trouvé sur le forum ni sur google de réponse à mon problème.

    Je suis actuellement sur un projet nécessitant une initialisation d'un grand nombre d'instances d'une classe (~350). Pour des comparaison afin de choisir un candidat.

    Disons que cette classe que l'on appellera Modele contient 2 vecteur de 30 et 15 instances de la classe Element ainsi que quelques valeurs double et un string. La classe Element contient 5 double.

    Les classes Model et Element contiennent toute deux des méthodes qui leurs sont propres.

    Cela vous donne une idée de la structure.

    Je génère me modèles moi même. ce qui me permet des les enregistrer dans un fichier type json, xml ou tout autre format souhaité.

    J'ai aussi générer du code avec les données des modèles pour ensuite l'inclure dans une méthode d'initialisation de mes modèles.

    Mon problème est que cela prend beaucoup trop de temps à mon gout.

    Pour tant l'initialisation de mes modèles ne comporte aucun traitement. Elle ne fait que définir les valeurs.

    Connaissez une méthode de sérialisation efficace et simple (hors boost qui est lourd (code qui sera embarqué) ou un autre moyen d'initialiser très rapidement des centaines d'instances.

    J'avais aussi pensé a déclarer un genre d'objet en static const avec toutes les valeurs et initialisation dans les constructeur imbriqués mais je trouve que ça fait un peu bricolage


    J'utilise visual studio pour la qualité de l'ide mais je souhaite un code poartable sous max et linux.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    A vrai dire, 350 éléments, c'est peu!

    Je crois que ton problème principal vient avant tout de vouloir utiliser json et xml. Ce sont des formats très utiles, mais ce sont des formats qui augmentent très largement les temps de lecture par rapport à de simple fichiers plats (par exemple). Et ils ne sont réellement intéressants que lorsqu'il s'agit de mettre différents éléments en relations les uns avec les autres. Et encore!

    As tu, simplement, essayé de lire (et d'écrire) tes données dans un fichier plat Après tout, peut être pourrais tu te contenter d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Modele model;
    ifs>>model.str>>model.double1>>model.double2 /* >> ... */;
    size_t elemCount;
    ifs>>elemCount;
    model.elems.reserve(elemCount);
    for(size_t i = 0;i<elemCount; ++i){
        Element elem;
        ifs>>elem.double1>>elem.double2>>elem.double3>>elem.double4>>elem.double5;
        model.elems.push_back(elem);
    }
    (c'est très certainement perfectible )Je serais surpris de voir la différence en termes de temps de chargements
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Si l'utilisation d'un format classique est préférée, une autre voie de progrès est de tester différentes bibliothèques XML/JSON. Ces dernières ne sont en effet pas toutes égales en terme de rapidité de lecture.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15
    Par défaut A tester
    Citation Envoyé par koala01 Voir le message
    Salut,

    A vrai dire, 350 éléments, c'est peu!

    Je crois que ton problème principal vient avant tout de vouloir utiliser json et xml. Ce sont des formats très utiles, mais ce sont des formats qui augmentent très largement les temps de lecture par rapport à de simple fichiers plats (par exemple). Et ils ne sont réellement intéressants que lorsqu'il s'agit de mettre différents éléments en relations les uns avec les autres. Et encore!

    As tu, simplement, essayé de lire (et d'écrire) tes données dans un fichier plat Après tout, peut être pourrais tu te contenter d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Modele model;
    ifs>>model.str>>model.double1>>model.double2 /* >> ... */;
    size_t elemCount;
    ifs>>elemCount;
    model.elems.reserve(elemCount);
    for(size_t i = 0;i<elemCount; ++i){
        Element elem;
        ifs>>elem.double1>>elem.double2>>elem.double3>>elem.double4>>elem.double5;
        model.elems.push_back(elem);
    }
    (c'est très certainement perfectible )Je serais surpris de voir la différence en termes de temps de chargements

    Je test cette solution et reviens pour vous faire par du résultat.

    En effet c'est très peu mais pourtant là ou une de-sérialisation des données en C# met environ 440ms. Cela met 3 minutes à s'instancier quand je codes les initialisation de ces objets en dur !!

    Ce temps est peut être dut au débogueur de VS et au fait du nombre d'instruction présentes dans le fichier mais je trouve ça bizarre.

    Pour le format de fichier, comme je le disais je ne souhait pas particulièrement du json ou xml. A vrai dire un format binaire le plus compact et occulte possible m'irait très bien

    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Les temps que tu indiques ont l'air extrêmement louches... Je pense qu'il y a un problème ailleurs... Ne ferais-tu pas plein de copies dans tous les sens ? Tu peux reproduire sur un cas simplifié à l’extrême (une vingtaine de lignes) la situation entre C++ et C# qu'on voit si on voit un loup ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    A noter que l'import/export en json est globalement (c'est à dire que ce n'est pas toujours le cas) plus rapide que le xml de par sa syntaxe un peu plus optimisée, en particulier pour la représentation des tableaux (et encore en particulier pour les tableaux d'objets).

  7. #7
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Bonjour !

    En quel mode effectues-tu tes tests de performance ?
    Je te vois parler du débogueur de Visual Studio et ça m'inquiète.
    En effet, tu ne pourras avoir un véritable aperçu des performances qu'en release et sans passer par le débogueur (Ctrl + F5 pour lancer ton programme).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. Creer un grand nombre de fichier rapidement
    Par exeroc dans le forum Général Python
    Réponses: 19
    Dernier message: 19/07/2011, 13h14
  2. Réponses: 2
    Dernier message: 13/09/2010, 11h24
  3. requete sql sur un grand nombre d enregistrement
    Par marielaure dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/08/2004, 11h53
  4. Traitement d'un grand nombre de champ
    Par k-lendos dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/03/2004, 15h13
  5. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

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