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 :

Pb d'allocation mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 10
    Par défaut Pb d'allocation mémoire
    Bonsoir,


    Je code en Pro*C.
    J'ai un pb d'allocation mémoire.
    J'utilise 3 tableaux de structure.
    Ne connaissant pas la taille des tableaux en début de programme, je récupère l'info grâce une requête en base.
    Ensuite, j'alloue la mémoire pour mes tableaux grâce à un malloc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tableau1 = (struct Tableau*) malloc((t1)*(sizeof(struct Tableau))) ;
    tableau2 = (struct Tableau2*) malloc((t2)*(sizeof(struct Tableau2))) ;
    tableau3 = (struct Tableau*) malloc((t3)*(sizeof(struct Tableau))) ;
    Actuellement, j'ai en BDD au maxi
    500000 enreg pour le tableau1
    350000 pour le tableau2
    et le tableau3 est la synthèse des 2 donc maxi 850000.

    L'exécution de mon programme plante toujours au même niveau d'exécution (en coredump).
    Selon moi, ce n'est pas un pb de données dans la mesure où, si je restreints mon exécution autour des données utilisées au moment du plantage, le programme se termine correctement.

    J'ai contrôlé toutes les fins de chaîne.
    J'ai essayé de faire une déclaration de mes tableaux avec des tailles fixes mais là aussi plantage direct en début de programme.

    Questions:
    - Savez-vous s'il existe une taille maxi pour une définition en dur?
    - Auriez-vous une idée pour corriger mon pb?

    Merci beaucoup.
    M JOLY MELOT

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mjolymelot
    Je code en Pro*C.
    J'ai un pb d'allocation mémoire.
    J'utilise 3 tableaux de structure.
    Ne connaissant pas la taille des tableaux en début de programme, je récupère l'info grâce une requête en base.
    Ensuite, j'alloue la mémoire pour mes tableaux grâce à un malloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tableau1 = (struct Tableau*) malloc((t1)*(sizeof(struct Tableau))) ;
    tableau2 = (struct Tableau2*) malloc((t2)*(sizeof(struct Tableau2))) ;
    tableau3 = (struct Tableau*) malloc((t3)*(sizeof(struct Tableau))) ;
    malloc() peut échouer. N'oublie pas de tester l'adresse avant de l'utiliser, et de libérer la mémoire après usage.

    http://emmanuel-delahaye.developpez....tes.htm#malloc
    J'ai contrôlé toutes les fins de chaîne.
    J'ai essayé de faire une déclaration de mes tableaux avec des tailles fixes mais là aussi plantage direct en début de programme.

    Questions:
    - Savez-vous s'il existe une taille maxi pour une définition en dur?
    - Auriez-vous une idée pour corriger mon pb?
    La taille maximale garantie d'une variable statique est 32k en C90 et 64k en C99. Ca peut être plus selon l'implémentation.

    Pour une variable automatique c'est beaucoup moins (quelques centaines de bytes). En fait ça dépend complément de l'implémentation et de l'exécution.

  3. #3
    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,

    Déjà, il faudrait pouvoir avoir une idée du contenu de tes quelques milliers d'enregistrements...

    On ne demande pas de trahir un secret d'état, mais juste de pouvoir savoir s'il s'agit d'enregsitrement qui prennent quelques octets chacuns ou s'il s'agit de mémoires d'étudiants au grand complet (tu comprendra tout de suite que tu auras plus de chances de faire "abdiquer" l'application dans le second cas )

    Ensuite, au vu du grand nombre d'enregistrements potentiel, il serait sans doute intéressant de pousser la réflection selon les termes suivants:
    1. as-tu besoin de travailler sur les trois tables en même temps?
    2. as-tu besoin de disposer de tous les enregistrement d'une table donnée en meme temp
    3. le temps d'exécution est-il important, ou peux tu envisager de "laisser tourner l'application toute la nuit" pour son traitement
    4. ne serait-il pas judicieux de diviser chaque table de manière cohérente en vue d'obtenir, par exemple 30 tables de 1000 enregistrements, et de sélectionner celle qui contiendra les enregistrements recherché/utilisés par ton application?
    5. Ne pourrais tu envisager de modifier ta structure sous forme de liste (par exemple) pour n'allouer à chaque fois que la mémoire nécessaire au travail sur les enregistrements en cours?

    Pour le point 5, je sais bien qu'une liste présente des désagréments vis à vis des tableaux, en rapidité d'acces, principalement, mais elle présenterais, à mon idée, l'énorme avantage de n'être pas obligé d'allouer 30.000 fois la taille d'un enregistrement d'un seul coup...

    Pour la rapidité d'acces, un arbre binaire, correctement rempli, ne prendrait, par exemple que 16 itérations de recherche maximum pour trouver un enregistrement parmis 65.535 ... à méditer
    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

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 44
    Par défaut omim
    A mon avis mjolimelot,tu devrais plutoto utiliser des fichiers car les chiffres que tu donnes pr tes strucutures sont vraiment enorme

    l'utilisation de fichiers devrait resoudre ton probleme

  5. #5
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Ses données sont dans une base de données. Il ne va pas les copier dans des fichiers avant de les transférer en mémoire ! Ca n'aurait aucun intérêt (enfin, sauf cas particulier, mais ce n'est pas le cas ici) !

  6. #6
    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
    Je le répète, selon moi, vu les nombres d'enregistrements cités, l'idéal est de partir sur une structure dynamique pour chaque enregistrements plutot que sur un seul tableau monolitique, fusse-t-il alloué dynamiquement...

    Il est en effet plus facile de trouver la place en mémoire pour 50.000 "petits" blocs que pour un seul bloc devant contenir l'équivalant de ces 50.000 petits blocs...

    Sans compter que cela contourne le problème de la taille maximale possible pour un "bloc"... La seule restriction restante à ce moment là, devenant la quantité de mémoire disponible pour l'application... Mais celle-là, on ne peut pas facilement la faire "sauter"
    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

Discussions similaires

  1. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23
  2. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29
  3. Allocation mémoire
    Par DestyNov@ dans le forum C++
    Réponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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