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 :

problème de taille et de mémoire


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut problème de taille et de mémoire
    Bonjour,

    Je débute en programmation et je bute sur un petit problème.

    J'aimerais savoir s'il est possible dans un fichier de connaître préalablement la taille des données que l'on va copier afin de les allouer dynamiquement (malloc?).
    Le fichier comprend de nombreuses données et le problème est de pouvoir sélectionner à l'intérieur exactement ce que je veux .

    Merci d'avance

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Bonjour.
    Si vous voulez parler de la taille totale du fichier, alors c'est possible (cf fseek et ftell).

  3. #3
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    Non, justement.

    Je crois que je me suis mal exprimée.
    j'ai un fichier source dans lequels je n'ai besoin que d'une partie des informations. Ces informations peuventcorrespondres à 1% ou 90% du fichiers suivant le fichier que je traite.

    La partie qui m'intéresse démarre toujours par une séquence connue, et comme je l'ai dit à une taille variable.
    Elle peut faire 200 lignes comme 10 000. Voilà pourquoi j'ai besoin de savoir sa taille avant de démarrer mon programme.

    Si quelqu'un a une idée pour m'aider, je suis preneuse.

  4. #4
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Comment déterminez-vous la longueur de la partie qui vous intéresse? S'agit-il d'un fichier texte?

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par soria_t
    J'aimerais savoir s'il est possible dans un fichier de connaître préalablement la taille des données que l'on va copier afin de les allouer dynamiquement (malloc?).
    Si c'est un fichier binaire, oui avec fseek()/ftell(). Si c'est un fichier texte, ça va dépendre de l'implémentation.
    Sinon, on sait agrandir un tableau à coup de realloc() ou alors stocker dans des structures de données souples comme une liste chainée...

    Tout dépend de la structure du fichier... (texte, binaire, champs de taille fixes, variable...)

    Le fichier comprend de nombreuses données et le problème est de pouvoir sélectionner à l'intérieur exactement ce que je veux .
    Si le fichier est bien structuré, tu dois pouvoir faire ça sans avoir à le charger entièrement en mémoire... Il suffit de faire une lecture 'intelligente', c'est à dire en analysant les données pour y trouver le critère de recherche qui va bien...

    Une solution tordue est souvent le résultat d'un problème mal posé. Que veux-tu faire exactement ? Quelle est la structure du fichier ?

    EDIT :
    j'ai un fichier source dans lequels je n'ai besoin que d'une partie des informations.
    Quel est le critère de recherche ?
    Ces informations peuventcorrespondres à 1% ou 90% du fichiers suivant le fichier que je traite.
    Comment est déterminé la longueur de ces informations ?

    La partie qui m'intéresse démarre toujours par une séquence connue,
    OK, ça répond à une de mes question
    et comme je l'ai dit à une taille variable.
    Elle peut faire 200 lignes comme 10 000.
    Et ça, ça confirme ma 2ème question.
    Voilà pourquoi j'ai besoin de savoir sa taille avant de démarrer mon programme.
    Là, par contre, je ne vois pas le rapport.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    vu l'exposé très flou du problème, les solutions seront floues...

    Cependant, d'après le peu que l'on peut apercevoir, il faudra faire appel à des alloc, ou realloc.

    Est-ce vraiment la TAILLE qui est inconnue, ou le NOMBRE ?

    Qu'est-ce qu'une DONNEE ?

    200 lignes ou 10 000 lignes c'est la taille de la donnée ou c'est le nombre ?

    [Edit]
    Emmanuel on l'a fait quasi en même temps
    [/Edit]

  7. #7
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    Ces fichiers sont relativements bien structurés et comme je le disais, je connais la séquence de début des données qui m'intéresse. C'est comment le lire d'une façon intelligente qui pose problème.

    Je voulais essayer une boucle do while, mais je ne sais pas comment mettre un critère de début avant le décompte

    Merci de vos réponse.

  8. #8
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Comment savez-vous jusqu'où lire dans le fichier?

  9. #9
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    Argghhh

    je ne suis pas claire.
    Dans une séquence de protéine, le nombre d'atome est fixe mais ici je travaille sur des protéines de tailles différentes et donc qui peuvent être très différentes.

    Les données qui changent d'une protéines à l'autres c'est le nombres d'atomes, et tous ce qui les qualifie.
    Par bonheur chaque atome et ce qui le qualifie (coordonnées...) commence par la séquence ATOM.

    Ma question : comment transformer mon programme qui utilise un tableau statique en programme utilisant un tableau dynamique ? Il me semblait que pour ça ,il faut connaître le nombre d'atomes.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par soria_t
    je ne suis pas claire.
    Ce serait beaucoup plus clair si tu postais un exemple de fichier (espérons que ce soit du texte) et un exemple de ce que tu veux extraire...

  11. #11
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Si j'ai bien compris, un fichier représente une molécule. Un fichier est composé de blocs de données de taille variable représentant chacun un atome, c'est cela?
    Dans ce cas, si le nombre d'atomes n'est pas précisé au début du fichier, je ne pense pas qu'il soit possible de déterminer le nombre d'atomes sans avoir lu l'intégralité du fichier. Cependant, j'ai du mal à saisir le problème que cela engendre.

  12. #12
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    alors voici un exemple de fichiers et surtout des informations que je recherche.
    Bon le serveur n'aime pas les fichiers en .pdb, je l'ai donc mis en .c
    Là-dedans ce qui m'intéresse est la parties atome et tous ses composants. (Je crois qu'il n'y a pas de problème pour lire le format pdb)
    Chaque atome est sur une ligne.

    Et d'un fichier à l'autre, on n'a pas le même nombre d'atomes. J'ai besoin de stocker les données dans un tableau de taille adapté. D'où malloc qui me demande le nombre d'atomes au départ.

    Ais-je été plus clair ?

    Merci beaucoup,
    human_trail.c

  13. #13
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Quel programme faut-il utiliser pour ouvrir un document PDB? Ca n'a pas l'air d'être du texte.

  14. #14
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    Bon, j'ai résolu une parti du problème ne creant un tableau statique. maintenent il faut que je le rende dynamique et c'est là que je bute en fait. Je ne vois pas comment faire ma boucle pour qu'elle soit cohérente.


    while (!fp);
    /* Détection de la longueur des atomes */
    if ((s, "ATOM ", 6) != 0)
    for (LB=0; !feof(fp); LB++)
    fscanf(fp,"%d\n", &N);
    /* Fermeture du fichier fp */
    fclose(fp);

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je n'arrive pas à lire ton fichier

    mais d'après le problème pourquoi aurais-tu besoin de connaître à l'avance le nombre ?

    Comme on l'a dit plus haut, la fonction realloc permet la réallocation dynamique.

    Et dans ton cas, vraisemblablement le code devrait être quelque chose comme : (je ne mets par de code précis mais juste l'indication)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    structure ATOM {
        int Type ;
        Propriété 1 ;
        Propriété 2 ;
        Propriété  *TableauPropriétésDynamiques ;
        ..........
    }
     
    structure  PROTEIN {
          int Type ;
          ATOM *Atoms ;
    }
     
     
    void Fonction ( void )
    {
    structure ATOM *atom =NULL ;
    ........
     
    for (  ; ; )
    {
         Ouvre fichier
     
         for ( i = 0 ; i < longueur fichier ; i++ )
            if ( ligne[i]  contient le mot-clé ATOM )
               {
                      if ( atom == NULL )
                        {
                              Crée protéine  (alloc);
                        }
                      Crée atom (alloc)
                      Interprète ligne et stocke propriétés
                      Stocke atom dans  Protéine->Atoms
                      Met à jour atom->précédent, atom->suivant
               }
      }
    }

  16. #16
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    if ((s, "ATOM ", 6) != 0)
    Il ne manquerait pas quelque chose? Pour moi, ça n'a pas de sens et le test est toujours vrai (6!=0).

  17. #17
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    En fait je n'arrive pas à le charger ici.
    voici une adresse:
    http://www.rcsb.org/pdb/files/1d2q.pdb

  18. #18
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pourquoi pas la solution la plus basique : alloue un petit tableau avec malloc et lorsque tu es en train de lire, si tu as besoin de plus de place tu utilises realloc en doublant la taille.

    Ceci te permettra d'avoir un tableau dynamique qui grandit dépendant des besoins.

    Jc

  19. #19
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 100
    Points : 58
    Points
    58
    Par défaut
    Si c'était moi qui l'utilisais , je pense que c'est la solution que je choisirais.
    Mais on me l'a demandé pour mon collègue.
    Cette solution ne convient pas pour mon problème, malheureusement.
    Je vais essayer avec la solution proposé par souviron34, mais je ne vois pas le realloc ?

    Merci à tous

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par soria_t
    En fait je n'arrive pas à le charger ici.
    voici une adresse:
    http://www.rcsb.org/pdb/files/1d2q.pdb
    OK. C'est un bête fichier texte, et tu veux traiter les lignes qui commencent par "ATOM", c'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <...>
    ATOM      1  N   ARG A 121       9.189  41.062  23.540  1.00 61.69           N  
    ATOM      2  CA  ARG A 121       8.582  40.873  22.228  1.00 57.11           C  
    ATOM      3  C   ARG A 121       9.521  40.149  21.274  1.00 50.75           C  
    ATOM      4  O   ARG A 121      10.697  40.489  21.173  1.00 49.33           O  
    <...>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tant que ce n'est pas la fin de fichier
     Lire une ligne
     Si la ligne commence par "ATOM" 
      Traiter la ligne.
    La longueur des lignes peut être plus importante que dans le fichier que tu as montré ?

    Si c'est le cas, un mécanisme de réallocation en viendra à bout facilement, mais ce n'est pas complètement trivial...

    Et le traitement à faire sur la ligne, c'est quoi ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de taille mémoire
    Par Mengué georges dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 06/12/2013, 11h56
  2. Réponses: 4
    Dernier message: 02/02/2009, 17h21
  3. Graphisme, imagerie problème de taille mémoire ?
    Par colorid dans le forum Langage
    Réponses: 8
    Dernier message: 23/02/2008, 08h37
  4. [swing][JComboBox]Problème de taille
    Par n!co dans le forum Composants
    Réponses: 8
    Dernier message: 06/03/2004, 10h53
  5. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 09h41

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