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 :

Comment structurer un gros volume de données ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 92
    Par défaut Comment structurer un gros volume de données ?
    Bonjour,

    Pour calculer la position des planètes j'utilise des fichiers txt (théorie VSPO87) contenant ce type de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    L0;;
    1.75347045673;0.00000000000;0.00000000000
    0.03341656456;4.66925680417;6283.07584999140
    0.00034894275;4.62610241759;12566.15169998280
    0.00003417571;2.82886579606;3.52311834900
    ...
    L1;;
    ....
    ...
    B0;;
    ...
    ..

    Il s'agit de 8 fichiers txt contenant chacun plus d'un millier de lignes, chaque fichier est segmenté par des blocs dont les entêtes sont
    L0 à L5, B0 à B5 et R0 à R5. Chaque ligne contient elle-même 3 "doubles" que j'arrive à extraire dans des variables a, b, c.

    Ce que j'essaie d'obtenir c'est un accès facile à n'importe quelle donnée du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    planete[3]->B[5].b[500]
    Pour par exemple obtenir la 501eme valeur de la colonne "b" appartenant au bloc B5;; du fichier de la 3eme planète (Terre).

    J'ai essayé des structures, des vecteurs de vecteurs, des mixtes mais je n'y arrive pas, j'ai des problèmes d'accès mémoire.
    Le code est sans erreur à la compilation mais il plante parfois, il s'exécute d'autres fois.

    Auriez-vous un conseil pour faire ça proprement ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Salut,

    La première chose à connaitre est ce que représentent les données dans ton fichier,
    et mettre en place des structures ou classes représentant ces données.

    Je suppose que les nombres sont des coordonnées spatiales (x, y, z).
    Par contre les chaînes ????

    Ensuite, c'est visiblement un fichier CSV, donc il te faudra une fonction pour le lire.
    Enfin, une (ou des) fonction qui instanciera les classes / structures à partir des données lues.

    Qu'as tu fait jusqu'à présent ?

  3. #3
    Membre Expert Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Par défaut
    Citation Envoyé par Morgatte Voir le message
    Bonjour,
    Le code est sans erreur à la compilation mais il plante parfois, il s'exécute d'autres fois.
    Bonjour,

    Ce n'est pas parce qu'un code compile qu'il fonctionne, c'est même rarement le cas du premier coup

    Donc, avant de modifier toutes tes structures, cherche d'abord ce qui ne va pas dans ton code, c'est probablement un dépassement de capacité de certaines variables ou une mauvaise allocation de mémoire.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 92
    Par défaut
    Ce que représentent les données n'a pas d'importance en fait, ce sont simplement des "double".
    Je sais de quelle façon j'aimerais qu'elles soient structurées. La difficulté c'était comment écrire le code correspondant, je n'y suis pas arrivé tout seul.

    En décomposant le problème par ordre de complexité croissante, chatgpt m'a sortit une solution viable.
    je n'aime pas chatgpt, je pense que c'est un outil parfait pour la désinformation, mais pour la programmation je lui trouve quand même une utilité certaine.
    Maintenant j'accède simplement à n'importe quelle donnée comme je le souhaitais
    ex : data[4][6][2][500] 501eme donnée de la colonne c (2) du bloc B0 (6) de la 4e planète.

    Juste pour info, dans la théorie VSOP87 L0 à L5 sont les données permettant de calculer la Latitude héliocentrique 'L' d'une planète (B = Longitude, R = le Rayon Vecteur)
    Tel que L0 = Somme(Ai.Cos(Bi*TempsJulien+Ci)) (Dans le bloc L0) idem pour chaque bloc
    L (Latitude h) = L0+L1.TempsJulien^1+....+ L5.TempsJulien^5

    Merci pour vos réponses.

    Aparté.
    En fait j'aurais bien aimé le faire avec une structure. Je pense que ça marchais au détail près que je ne connaissais pas la taille finale des données et que je n'arrivais pas à augmenter la taille des structures à la volée.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Citation Envoyé par Morgatte Voir le message
    Ce que représentent les données n'a pas d'importance en fait, ce sont simplement des "double"
    Non !
    Ca c'est leur type au niveau le plus bas, juste au dessus de l'assembleur. Plus incompréhensible, on ne fait pas.

    Et on fait de C++, pas du C.
    Avec des tableaux, on peux représenter n'importe quoi.
    Pour la compréhension, on repassera. Surtout dans 3 ou 6 mois, quand tu auras oublié les 3/4 de ce que tu as écris et qu'il faudra que tu te replonges dedans.

    Je reprend un extrait de ton fichier et te repose la question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L0;;
    1.75347045673;0.00000000000;0.00000000000
    L0: c'est quoi ?
    1.75347045673: c'est quoi ?
    0.00000000000: c'est quoi ?
    0.00000000000: c'est quoi ?

    Programmer ce n'est pas simplement fourrer des données dans des variables, c'est aussi formaliser un concept en un ensemble d'entités compréhensibles et facilement manipulable.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 92
    Par défaut
    Les fichiers de données originaux se trouvent ici. En particulier le fichier VSOP87D.ear

    Les fichiers avec les ;; ne sont pas des fichiers CSV ce sont des fichiers que j'ai moi-même reconstitués avec les données originales qui m'étaient utiles.

    Et non je n'ai pas besoin de savoir ce que représentent :
    1.75347045673: c'est quoi ?
    0.00000000000: c'est quoi ?
    0.00000000000: c'est quoi ?
    J'ai juste besoin de savoir que ce sont des doubles, comment je souhaite les organiser pour les rendre facilement accessibles et comment les utiliser pour effectuer mes calculs.
    Et ça marche parfaitement. Je retrouve maintenant les mêmes coordonnées qu'avec mon télescope (au dixième de degré d'arc près, ce qui est vraiment précis en fait).

    J'imagine que 1.753..... et les autres sont les coefficients d'une suite harmonique dont chaque terme est une correction de plus en plus précise des perturbations dûes à l'attraction des autres planètes, mais je ne peux pas l'affirmer. Il faudrait lire le pourquoi du comment de la théorie VSOP87 (en anglais) mais méconnaitre la nature des données n'empêche en rien d'effectuer les calculs.


    Tout ce que je voulais (et c'est fait) c'était de pouvoir accéder à ces données toutes les secondes en mémoire plutôt que dans de volumineux fichiers.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Ok ...
    Tu manipules des trucs que toi seul comprend ....

    Débrouilles-toi.

  8. #8
    Invité de passage

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Par défaut
    Une précision quand même, quelques centaines de Ko, c'est pas un gros volume de données. Surtout que c'est du texte et que ca prendra moins de place en mémoire.

    Donc a voir si tu as besoin de charger plusieurs fichiers en même temps et l'occupation mémoire, mais ça me semble tout a fait possible de simplement charger tout le fichier en mémoire en une seule fois et ne plus utiliser ensuite le fichier.

    Pour le code, ce que deedolith veut dire, c'est que pour créer les structures de données, on essaie généralement de nommer en donnant un sens. Si par exemple tes 3 valeurs sont un point dans l'espace, on fera une classe Point, qui contient x, y, z.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct Point { double x, y, z; };
    Mais pour écrire un tel code, il faut comprendre ce que signifie tes données. Idem pour L0, L1, B0, etc.

    L'autre chose, c'est qu'il faut aussi savoir comment tes données sont utilisées, comment tu y accèdes. Est-ce que L0, L1, B0, etc sont des champs fixes et tu peux les mettre directement dans une structure ? Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct data {
        vector<Point> L0;
        vector<Point> L1;
        vector<Point> B0;
        etc
    };
    Ou alors c'est une liste de valeurs de taille variable ? Est-ce qu'il faut une map ou un vector ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct data {
        vector<vector<Point>> L;
        vector<vector<Point>> B;
    };
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct data {
        map<string, vector<Point>> data;
    };
    Et on peut imaginer des centaine de structures de données comme ca. Sans savoir plus sur tes données et ton code, on peut pas décider quelle est le meilleure structure.

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

Discussions similaires

  1. Comment gérer de gros volumes
    Par gromanu dans le forum Cognos
    Réponses: 6
    Dernier message: 11/07/2008, 19h01
  2. Réponses: 3
    Dernier message: 11/05/2007, 13h47
  3. [Recherche texte sur gros volume de données]
    Par tesla dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 21/02/2007, 13h43
  4. Structure de données pour gros volume de données
    Par Invité dans le forum Langage
    Réponses: 9
    Dernier message: 01/02/2007, 11h58
  5. Gérer le gros volume de données
    Par berceker united dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 21/07/2006, 19h29

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