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 :

programme qui plante lorsque trop de calculs


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut programme qui plante lorsque trop de calculs
    re-bonjour tout le monde,

    j'ai une nouvelle question

    Je fais un petit programme qui calcul des coordonnées dans l'espace et mon programme plante lorsque le maillage devient trop grand

    Quand je dis planter je veux dire que mon ordi n'est pas lent, j'ai immédiatement le message d'erreur "envoyer rapport d'erreur etc..."

    Comment éviter cela ?

    Vous me direz peut être que c'est logique (question de RAM etc...) mais alors si c'est normal comment font les programmes qui peuvent faire des calculs très lourd tel que Matlab ?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Sans un code minimal de ton programme, il nous est difficile de voir les problèmes potentiels de ton code.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Je peux vous le mettre mais je ne suis pas sur que cela soit très utile puisqu'il marche très bien ... pour un maillage de 50x50, de 100x100 ou de 200x200 mais pour du 500x500 j'ai le droit au rapport d'erreur

    c'est pour cela que j'imagine que c'est un problème mémoire mais pour un programme comme Matlab, il ne plante pas, il mouline pendant une demi heure et donne la solution

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Euh, ben pour voir où la bât blesse, même si ça marche pour les petites charges, il faut qu'on voie le code, sinon...
    A part ça, comment résoudre les problèmes de volumétrie...économiser la mémoire, et ne pas tenter de tout garder en mémoire (sectionner le problème et écrire au fur et à mesure, dans des fichiers temporaires ou dans le fichier définitif...)

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par therwald Voir le message
    Euh, ben pour voir où la bât blesse, même si ça marche pour les petites charges, il faut qu'on voie le code, sinon...
    A part ça, comment résoudre les problèmes de volumétrie...économiser la mémoire, et ne pas tenter de tout garder en mémoire (sectionner le problème et écrire au fur et à mesure, dans des fichiers temporaires ou dans le fichier définitif...)
    Je pressent une explosion de la pile. 500x500 entités de X octets allouées sur une pile, on va vite dépasser le Mo généralement réservé pour celle-ci. Le simple fait de stocker un uint32_t va probablement poser un problème. Si les objets stockés dans le tableau on une taille plus importante, ça va poser problème très, très rapidement.

    Si ça passe avec 200x200, c'est que les objets font moins de 26 bytes.

    Quoi qu'il en soit, quand on a besoin d'une grosse quantité de mémoire comme ça, on ne la prends pas sur la pile : on l'alloue
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Suite à vos conseils j'ai un peu réflechi à mon algorithme et tu avais raison therwald, je déclarais tout sous forme de tableau statique alors que je pouvais tout simplement stocker mes calculs intermédiaires dans quelques variables qui seraient remplacées à chaque itération . Du coup c'est ce que j'ai fais et mon calcul tourne dorénavant pour n'importe quelle valeur de maillage

    Merci beaucoup donc

    Et sinon n'étant pas programmeur je ne connais pas trop la différence entre prendre la mémoire sur la pile et l'allouer mais je vais me renseigner car cela m’intéresse beaucoup

    Merci à tous

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Et sinon n'étant pas programmeur je ne connais pas trop la différence entre prendre la mémoire sur la pile et l'allouer mais je vais me renseigner car cela m’intéresse beaucoup
    Prendre la mémoire sur la pile:
    déclaration de variable locale dite "automatique". Ci-dessous une allocation de tableau qui présente ce défaut cité par Emmanuel Deloget
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GrosseClasse tableau[250];
    Et là, la même en allocation dynamique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GrosseClasse[]* tableau=new GrosseClasse[250];
    /*...travail sur le tableau en question...*/
    delete[] tableau;
    Sachant que toute mémoire allouée par new doit avoir son delete (s'agissant d'un tableau il faut choisir la variante delete[].
    L'allocation dynamique est sujette à des erreurs désatreuses ('oubli' du delete, ou 'delete' prématuré qui provoque des plantages ou corruptions de mémoire), mais il existe des structures de données standard pour gérer des stockages dynamiques (ils gèrent pour toi=>moins de risque d'erreur).
    Ex: std::vector, ou pour de grosses quantités de mémoire std::list qui trouve plus facilement la mémoire dont il a besoin car il ne cherche pas forcément à tout trouver d'un bloc, contrairement à std::vector.
    Dans ce cas la référence de la structure de donnée est prise sur la pile:
    , mais comme en interne il réserve dynamiquement sa mémoire de stockage, ne gardant sur la pile que les "références" du tableau (je simplifie) et non les données, il ne surcharge pas la pile.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Arf je m'aperçois que j'ai expliqué l'aspect syntaxique sans expliquer les termes pile vs dynamique.
    • la pile <-> la pile d'appel qui mémorise les paramètres de fonctions et les variables locales aux fonctions, dite 'pile' car à chaque niveau d'appel de fonction on crée ("empilage") un nouveau niveau de stockage pour mémoriser les paramètres d'appel et les variables locales. Au retour de fonction on libère le stockage local ("dépilage") et on remonte au niveau de stockage correspondant à la fonction appelante pour retrouver ce qu'on appelle son contexte (les variables qu'elle utilise localement et ses paramètres d'appel).
    • Le stockage dynamique fait appel à ce qu'on appelle le 'heap', un autre espace de stockage. Comme je disais précédemment, la gestion à ce niveau se fait manuellement (instruction new ou new[] quand on réserve la mémoire, instruction delete ou delete[] quand on la libère.

    La différence entre les deux est que la pile est un stockage de taille limitée et fixe allouée au lancement d'un processus (ou d'une thread mais c'est un autre sujet), alors que le 'heap' fait appel à 'la masse' de la mémoire du système, et peut être agrandi tant que le système d'exploitation accepte de fournir.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    C'est super intéressant, je savais qu'il existait une différence entre stockage statique et stockage dynamique mais j'étais loin de me douter qu'il y avait une telle différence en mémoire .

    Pour moi la seule différence qu'il y avait c'était, par exemple dans le cas d'une allocation dynamique, le fait de pouvoir ajouter des cases à un tableau après le lancement d'un programme (par exemple un carnet d'adresse).

    Donc en gros pour faire de gros calculs scientifiques (telle que des champs de températures) il vaut mieux opter pour une allocation dynamique même si on connait d'avance le nombre de mailles ?

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Donc en gros pour faire de gros calculs scientifiques (telle que des champs de températures) il vaut mieux opter pour une allocation dynamique même si on connait d'avance le nombre de mailles ?
    Oui. Par contre, par rapport aux conteneurs de données de la STL on peut faire en sorte de réserver à la création la mémoire nécessaire (fonction reserve) ce qui dans le cas de std::vector par exemple est préférable en termes de perf (sinon, il va agrandir son stockage au fil de l'eau, ce qui résulte en n recopies successives du tableau, avec des impacts en termes de temps d'exécution et aussi en terme de pic de conso mémoire(vu que pour recopier à un moment donné il te faut avoir les deux zones mémoires en même temps))
    Et quoi qu'il arrive, sur gros jeux de données il vaut mieux réfléchir à la quantité de mémoire qu'on utilise car en surconsommer peut affecter les performances (swap par ex) ou même faire échouer le calcul (pas assez de mémoire sur le système).

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

Discussions similaires

  1. programme qui plante
    Par warubi dans le forum C++
    Réponses: 35
    Dernier message: 04/02/2007, 10h57
  2. Programme qui plante : seg fault
    Par Premium dans le forum C
    Réponses: 10
    Dernier message: 01/12/2006, 15h12
  3. programme qui plante. chercher/remplacer dans des fichiers.
    Par [Hugo] dans le forum Général Python
    Réponses: 2
    Dernier message: 31/10/2006, 17h10
  4. Faire un programme qui plante et noter le plantage
    Par cedricgirard dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 16h36
  5. Programme qui plante
    Par harris_macken dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2005, 23h50

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