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 :

Lire une base de données et la stocker en mémoire sous forme de colonne


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Par défaut Lire une base de données et la stocker en mémoire sous forme de colonne
    Bonjour a tous,

    Je travaille dans le milieu des statistiques. Je travaille sur la base de donnée suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    |-----+-----+-------+
    |Name |Age  |Gender |
    |-----+-----+-------|
    |Marc |32   |M      |
    |Isa  |36   |F      |  
    |Lea  |35   |F      |
    |Lee  |31   |M      |  
    |-----+-----+-------|
    (en beaucoup plus gros bien sur).
    Sur mon disque, elle est au format .csv. Elle est enregistrée sous forme de ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Name","Age","Gender"\n"Marc",32,"M"\n"Isa",36,"F"\n"Lea",35,"F"\n"Lee",31,"M"\OEF
    Je souhaite la stocker en mémoire sous forme de colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Marc Isa Lea Lee 32 36 35 31 M F F M
    Savez-vous comment faire ca de manière efficace ? J’ai pensé à 3 méthodes :
    • Première
      1. Lire la première ligne entièrement.
      2. Créer des vectors pour chaque colonne.
      3. Stocker les données au fur et a mesure de la lecture du fichier dans les vectors.
      4. De temps en temps, il faudra faire une recopie d’un vector, quand celui-ci est trop petit.

    • Deuxième
      1. Lire la base intégralement une fois, pour connaitre le nombre de ligne et le nombre de colonne
      2. Créer en mémoire des tableaux de tailles adéquates.
      3. Lire ensuite la base de données une deuxième fois en remplissant les tableaux.

    • Troisième
      1. Lire la base intégralement et la stocker en ligne.
      2. Puis faire des permutations entre les valeurs.


    Laquelle serait la plus efficace ? A y-t-il une autre méthode encore plus efficace ?

    Christophe

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Bonjour,

    Etes vous obligé d'utiliser le C, ou l'utilisation du c++ est elle permise? Dans le second cas l'utilsation de la classe std::vector ou std::list pourrait etre utile et éviter les problèmes de recopie du vecteur quand celui là est trop petit (pour la solution 1). Sinon la solution me parait comporter moins de risque de plantage liée à une mauvaise allocation mémoire que la 1.

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    À moins d'utiliser une implémentation d'allocateur complexe (type slab par exemple), std::vector doit aussi recopier son contenu lors d'une réallocation. Il n'y a pas de magie.

    Je pars du principe que la technologie utilisée est le C.

    Christophe, qu'est-ce qui t'empêche d'utiliser une structure pour chaque entrée (stockage « entrelacé ») ? Tu as des requêtes à faire sur les différents champs ? À quel problème initial le système répond-il ?

  4. #4
    Membre chevronné

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Par défaut
    Merci pour vos réponses.

    @kajtp
    Je n'ai pas de contrainte, je peux utiliser le C comme le C++.

    @Matt_Houston
    Je vais faire des analyses statistiques. Donc je vais par exemple avoir besoin d’accéder à la colonne Age pour en calculer la moyenne, l'écart type, la variance, la médiane, les quartiles...
    Juste Age parce qu'une moyenne sur les Gender, ca n'a pas de sens.

    Plus tard dans mes analyses, j'aurais besoin de calculer les effectif de Gender (compter le nombre de M et de F). A ce moment, là, j'aurais besoin juste de Gender, plus de Age...

    Encore plus tard, j'aurais plein de truc hyper compliqué (régression logistique, ACP, AFP, clustering...) sur une seule colonne, ou sur deux colonnes, selon les cas.

  5. #5
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    si tu te lances en C, autant utiliser un petit sgbd pour te simplifier la vie. Sqlite pourrait très bien faire l'affaire après un import csv. Tu n'as pas besoin d'installer un serveur ou de faire de grosse configuration, il est efficace, rapide … bref à tester dans ton cas.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Bonjour,

    Matt_Houston a raison, "std::vector doit aussi recopier son contenu lors d'une réallocation.", sans entrer dans des considérations de l'efficacité de traitement , je voulais simplement dire que le push_back() permet de rendre "invisible" au codeur le coté réallocation (même si elle doit être faite on est bien d'accord )

    Et oui une liste de structure ou la solution sqlite paraissent bonnes.

Discussions similaires

  1. Lire une base de donnée sqlite avec sql.js
    Par clo_ljk dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/08/2014, 13h26
  2. Réponses: 2
    Dernier message: 03/01/2014, 15h19
  3. lire une base de données
    Par nanouchg dans le forum MATLAB
    Réponses: 1
    Dernier message: 27/12/2011, 17h18
  4. Réponses: 3
    Dernier message: 04/08/2010, 14h05
  5. Lire une base de données access 2007 avec access 2003
    Par gblanchard dans le forum Runtime
    Réponses: 6
    Dernier message: 08/05/2007, 02h59

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