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

  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

  7. #7
    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
    Oui, je suis de ton avis aussi.

  8. #8
    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
    Citation Envoyé par zooro
    Oui, je suis de ton avis aussi.
    Moi aussi

    Le seul problème étant alors le choix de la structure dynamique:

    Une pile ou une file peut ne pas etre adaptée à son travail

    Une liste, simplement ou doublement chainée provoquera un temps de latence interminable pour accéder au... 49.999 élément ou pour un tri global

    un arbre binaire présentera des difficultés algorithmiques pour s'assurer de son remplissage optimal.
    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

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    On ne sait pas trop le traitement effectué sur les données, néanmoins j'essayerais ceci : plutôt que de copier les données en mémoire, je les laisserais sur le disque et je me contenterais d'un couple (ou un triplet) de nombres, (numero du fichier 1 ou 2, numero d'enregistrement dans le fichier ou offset & longueur) pour indexer les données.
    Celà prendra beaucoup moins de place en mémoire, mais celà risque peut-être/surement de ralentir le traitement à cause du temps d'accès aux données, il faut tester.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre confirmé Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut
    La fonction farmalloc te permet d'allouer toute la memoire >à 64k (1 segment)
    mais il faudra que tu compile en model far.
    Malgré tous je pense que ce n'est pas la bonne sol et qu'il faut mieux travail sur tes fichiers.

  11. #11
    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 gijy
    La fonction farmalloc
    keskidi ? Qui a parlé de x86 mode réel ?

    Merci de ne pas raconter n'importe quoi...

  12. #12
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    La question est : est-il nécessaire d'avoir toutes les données en mémoire en même temps ? En quoi consiste le traitement, si ce n'est pas un secret ?
    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.
    Il doit être possible d'éviter des copies en mémoire de ces enregistrements, même dans des fichiers... Mais il faut plus d'explications !

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