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 :

Modélisation 2D/3D de données : conseils ?


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut Modélisation 2D/3D de données : conseils ?
    Bonjour,

    Je vous expose la situation :
    * Je dois créer un logiciel X qui lit un fichier créer par un autre logiciel Y
    * Les données des fichiers générés par Y sont une succession de lignes qui décrivent comment dessiner de(s) objet(s). Les fichiers peuvent être décomposer ainsi :
    > En en-tête : De quel type de modélisation traite-t-on, s'agit-il d'un dessin 2D, etc etc
    > Dans le corps, il y a les données : x0 = 1, y0 = 2(ligne) x1 = 5.3 y1 = 6
    * Une fois que le logiciel X a lu le fichier, il doit modéliser ces données.
    * Je n'ai pas l'autorisation de modifier Y. Par contre, je peux demander au programmeur de Y de modifier la manière dont sont écrites les données dans les fichiers.

    Ma vision de la solution est la suivante :
    0] Demander au programmeur de Y de formater les fichiers de sorties. Pour cela, utiliser le format XML par exemple.
    Ainsi, la notion de position des données est supprimée. Effectivement, avant les données étaient enregistrées tel quel :
    x = 3 y = 5
    Donc, on savait que la valeur de x était en position 4 et y en 10.
    Avec un système de balisage, j'aurais :
    <x>3</x><y>5</y>
    L'extraction de la donnée est plus longue mais plus facile et non dépendante de la position des données.

    1] Créer une interface entre Y et X. J'appellerais ce logiciel Z.
    Ce logiciel Z s'occupe de lire le fichier généré par Y.
    Il effectue une première lecture durant laquelle il va stocker l'en-tête ainsi que la position des balises. Il crée un index en somme.
    Ensuite, Z se met en attente de requête de la part de X.

    2] Pour le logiciel X, je vais l'articuler ainsi :
    > Lorsque l'utilisateur demande d'ouvrir un fichier(généré par Y), X exécute l'interface Z avec comme paramètre ce fichier.
    > Ensuite, le logiciel X communique avec Z. X demande à Z de lui fournir des données(qu'il sait afficher). C'est donc Z qui va indiquer comment afficher les données, X ne s'occupe que d'afficher.
    > Lorsque l'utilisateur ne fait rien, la communication est en pause.
    > Lorsque l'utilisateur ferme le fichier, la communication est fermée.

    Précisions diverses :
    * Les fichiers générés par Y peuvent être très lourds(> 1Go).
    Mais peu importe la taille des fichiers, il ne doit pas y avoir de ralentissement lors de l'ouverture. Donc un fichier de 10Go doit être ouvert aussi rapidement qu'un fichier de 10Ko. Bien entendu, le traitement est forcément plus long, mais ça je ne peux rien y faire ?

    Voilà l'histoire.
    J'aimerais savoir si vous pensez qu'il s'agit d'une bonne solution.
    Le format XML est-il bien approprié ? Un meilleur format(pas trop compliqué pour le programmeur de Y) ?
    L'interface peut-elle être améliorée ? Comment programmer l'interface : un exécutable indépendant, un objet de Y ?
    En ce qui concerne X, connaissez vous de bonne librairies qui permettent la modélisation 2D/3D et qui peuvent traiter de façon fluide énormément de données ?

    Un grand merci pour votre aide

  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,
    Citation Envoyé par zizoufoot Voir le message
    Bonjour,

    Je vous expose la situation :
    * Je dois créer un logiciel X qui lit un fichier créer par un autre logiciel Y
    * Les données des fichiers générés par Y sont une succession de lignes qui décrivent comment dessiner de(s) objet(s). Les fichiers peuvent être décomposer ainsi :
    > En en-tête : De quel type de modélisation traite-t-on, s'agit-il d'un dessin 2D, etc etc
    > Dans le corps, il y a les données : x0 = 1, y0 = 2(ligne) x1 = 5.3 y1 = 6
    * Une fois que le logiciel X a lu le fichier, il doit modéliser ces données.
    * Je n'ai pas l'autorisation de modifier Y. Par contre, je peux demander au programmeur de Y de modifier la manière dont sont écrites les données dans les fichiers.

    Ma vision de la solution est la suivante :
    0] Demander au programmeur de Y de formater les fichiers de sorties. Pour cela, utiliser le format XML par exemple.
    Ainsi, la notion de position des données est supprimée. Effectivement, avant les données étaient enregistrées tel quel :
    x = 3 y = 5
    Donc, on savait que la valeur de x était en position 4 et y en 10.
    Avec un système de balisage, j'aurais :
    <x>3</x><y>5</y>
    L'extraction de la donnée est plus longue mais plus facile et non dépendante de la position des données.
    Avec, comme résultat, des fichiers inutilement lourds.

    XML, c'est très bien pour formater les données, je te l'accorde, mais cela correspond souvent à sortir le bazooka pour essayer d'atteindre une mouche.

    Dans ton cas, tu auras sans doute beaucoup plus facile avec la tapette à mouche ou le journal roulé
    1] Créer une interface entre Y et X. J'appellerais ce logiciel Z.
    Ce logiciel Z s'occupe de lire le fichier généré par Y.
    Il effectue une première lecture durant laquelle il va stocker l'en-tête ainsi que la position des balises. Il crée un index en somme.
    Ensuite, Z se met en attente de requête de la part de X.
    Encore plus lourd, encore plus inutile
    2] Pour le logiciel X, je vais l'articuler ainsi :
    > Lorsque l'utilisateur demande d'ouvrir un fichier(généré par Y), X exécute l'interface Z avec comme paramètre ce fichier.
    > Ensuite, le logiciel X communique avec Z. X demande à Z de lui fournir des données(qu'il sait afficher). C'est donc Z qui va indiquer comment afficher les données, X ne s'occupe que d'afficher.
    > Lorsque l'utilisateur ne fait rien, la communication est en pause.
    > Lorsque l'utilisateur ferme le fichier, la communication est fermée.
    Et, pourquoi pas "simplement" parser le fichier tel qu'il est
    Précisions diverses :
    * Les fichiers générés par Y peuvent être très lourds(> 1Go).
    Mais peu importe la taille des fichiers, il ne doit pas y avoir de ralentissement lors de l'ouverture. Donc un fichier de 10Go doit être ouvert aussi rapidement qu'un fichier de 10Ko. Bien entendu, le traitement est forcément plus long, mais ça je ne peux rien y faire ?
    Ca, tu peux oublier d'office.

    10k, il y a de très fortes chances pour que cela tienne sur un seul "cylindre" du disque dur.

    Autrement dit, il y a de très fortes chances pour que ton fichier soit lu en un seul tour de plateau du disque dur

    1Gb, ca ne tiendra jamais sur un seul cylindre, malgré le fait que la capacité des disques durs augmente sans cesse.

    "Si tu as de la chance" et qu'il n'y a pas de fragmentation du fichier (hé oui, ca arrive encore sous windows ), tu pourras peut être éviter d'avoir des temps de latence trop important durant la lecture, mais, une chose est sure, il faudra bien plus d'un tour de plateau du disque dur pour arriver à le lire

    Voilà l'histoire.
    J'aimerais savoir si vous pensez qu'il s'agit d'une bonne solution.
    Le format XML est-il bien approprié ? Un meilleur format(pas trop compliqué pour le programmeur de Y) ?
    Amusons nous un tout petit peu à compter :
    ca fait une ligne de 8 caractères, plus les éventuels espaces.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <point id="0"><x>1</x><y>2</x></point>
    (ad minima si tu veux un XML bien formé) ca fait 38, soit pres de 5 fois plus caractères pour un point strictement identique.

    Si tu demandes à convertir un fichier de 1Gb en xml, tu peux t'attendre, en gros, à ce qu'il fasse pas loin de ... 5Gb au final.

    Cela fait des temps d'accès cinq fois plus long au niveau du disque dur, et cela fait un fichier qui risque vraiment d'envoyer la meilleur bibliothèque XML au tapis, à cause des récursions qu'elle va rencontrer
    L'interface peut-elle être améliorée ? Comment programmer l'interface : un exécutable indépendant, un objet de Y ?
    Développe ton X et fait en sorte qu'il doive lire un format le plus simple possible, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # n° du point  X  Y
    1 1 2
    2 3 5
    3 12 85
    ...
    8574 15 64
    [edges]
    # N° de l'arrête N° point1 N° point2
    1  10 15
    2 1 3
    ...
    4587 7653 4100
    C'est un format qui sera facilement généré par l'application Y et qui sera facilement lu par la tienne.

    Si cela te suffit, tu ne t'en portera que mieux
    En ce qui concerne X, connaissez vous de bonne librairies qui permettent la modélisation 2D/3D et qui peuvent traiter de façon fluide énormément de données ?
    Ce ne sont ni les formats ni les bibliothèques qui manquent, que ce soit en 2D ou en 3D...

    Pour te permettre de te faire une idée, voici une liste (qui n'est peut être pas exhaustive)

    Mais avant de t'inquiéter de cela, il y a peut être deux questions que tu devrais te poser et dont la réponse orientera sans doute ton propre choix:
    Que sont sensées représenter les données C'est une modélisation, ca, je l'ai bien compris, mais c'est plutôt une modélisation d'animation, ou plutôt de la modélisation "géospatiale"
    Tu ne manipuleras, très certainement, pas les données de la même manière

    La deuxième question est pire encore : que devras faire ton application une fois qu'elle aura chargé ces données

    Car, au final, le chargement des données (et leur interprétation) ne sera jamais que la première étape, mais je présumes que tu voudras faire "quelque chose" de ces données une fois que tu les auras lues

    Et, bien sur, la manière dont tu pourras envisager de les manipuler dépendra de la manière dont tu les as interprétées (ou plutôt : la manière dont tu interpréteras les données dépendra fortement de la manière dont tu veux les manipuler par la suite ).

    Sinon, pour ce qui est de la lecture des données en elles-même, tu peux éventuellement faire un petit tour du coté de boost::serialization.

    C'est simple, c'est efficace

    Enfin, si tu veux un exemple d'application de modélisation, tu peux aller voir du coté de blender, qui supporte (nativement ou par ajout) quelques formats de modélisation sympas, et pour lequel tu pourras même trouver les sources en cherchant bien
    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
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par koala01 Voir le message
    La deuxième question est pire encore : que devras faire ton application une fois qu'elle aura chargé ces données
    Vu la taille envisagée pour les fichiers, il me parait impensable de ne pas faire le traitement au fil de la lecture → lecture avec callbacks. D’ailleurs, je pense que c’est ce qui est entendu par « il ne doit pas y avoir de ralentissement lors de l’ouverture ».

    Pour le reste, rien à ajouter

Discussions similaires

  1. Modélisation de base de donnée SQL server
    Par kfmystik dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 15/07/2008, 10h11
  2. Modélisation de base de données
    Par coco-sup dans le forum Oracle
    Réponses: 5
    Dernier message: 01/02/2007, 17h37
  3. Modéliser une base de données non relationnelle ?
    Par korrigan dans le forum Schéma
    Réponses: 4
    Dernier message: 19/01/2007, 16h35
  4. modéliser une base de données sur SQL Server ..
    Par Alexy3171 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/11/2006, 15h57
  5. [SQL Server 2005] Outils de modélisation de base de données
    Par margagn dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 28/08/2006, 17h37

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