Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arrêt de python lors d'un programme long

Terminal de Ubuntu 16.04 LTS python ne termine pas

Sujet résolu
    13 janvier 2018 à 17:21:26

    Bonjour,

    J'ai créé un programme qui permet de résoudre le jeu "splashy dot" disponible sur IOS avec un code python brute qui test toutes les possibilités.

    Cependant, plus il y a de points a parcourir plus le nombres de chemins à tester augmente (4^nombre de points dans le pire des cas).

    Et c'est la première fois que je lance un programme aussi long tourner.

    Mais voici mon problème:

    Quand je le lance dans le terminal, j'ai pris le soin dans mon code de mettre une variable (nommée reference) qui change de valeur en fonction de la fonction a tester. Cette variable qui est un tableau change de valeurs tellement vite qu'on ne peut pas toutes les lires (les 5 premières du tableau du moins). 

    Le tableau est affiché avec un "print"

    Cependant, à certains moments le terminal "bug", c'est à dire que pendant une demi-seconde, le programme s'arrête de fonctionner (aucun message d'erreur) puis il reprend. Je le vois au fait qu'il affiche ensuite les valeurs suivantes de mon tableau reference.

    Et ce "bug" s'empire de plus en plus jusqu'au moment où mon tableau qui est affiché ne s'affiche plus, preuve que mon ordinateur à arrêté de faire fonctionner mon programme python. De plus ma souris et mon clavier met beaucoup de temps a réagir (lag) mais ça ce n'est pas grâve.

    Donc ma question est: Pourquoi mon ordinateur arrête-t-il de faire tourner mon programme python ?

    PS: Je précise que j'ai désactiver le mode veille de mon ordinateur Acer Linux Ubuntu 16.04 LTS

    Merci d'avance pour vos réponses et n'hésitez pas à me poser des questions pour plus d'informations

    • Partager sur Facebook
    • Partager sur Twitter
      14 janvier 2018 à 10:00:06

      Salut,

      J'essaye de comprendre votre problème, sans code...

      Es-ce que vous sauvegardez vos résultats dans une variables? Si oui, faites attentions, vous surchargez peut-être la mémoire de votre ordinateur..

      Surtout si vous sauvegardez tous les possibilités dans une variable... Le mieux serait de sauvegarder dans un fichier... et de libérer l'espace de la variable de temps en temps..

      N'oubliez pas que si vous avez 2Gig de mémoire vive, il ne peut pas sauvegarder plus que cela... il faut libérer l'espace en sauvegardant dans un fichier (le disque dure).

      Essayez de regarder votre usage de la mémoire... comme avec: htop

      Bonne chance

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2018 à 14:50:23

        Salut,

        Merci de ta réponse nolimitech,

        Mais en fait, je stocke les valeurs dans un tableau par exemple:

        reference = [1, 1, 2, 3, 2, 3, 4]

        Puis j'incrémente de 1 ce tableau c'est à dire que reference devient:

        reference = [2, 1, 2, 3, 2, 3, 4]

        Puis:

        reference = [3, 1, 2, 3, 2, 3, 4]

        Puis:

        reference = [4, 1, 2, 3, 2, 3, 4]

        Puis

        reference = [1, 2, 2, 3, 2, 3, 4]

        En gros dans mon utilisation, cela signifie:

        1->aller à droite

        2->aller en bas

        3->aller à gauche

        4->aller en haut

        On peut dire que reference est alors un nombre en base 4 (commençant par 1 et finissant par 4 par contre (pas de 0 à 3))

        Puis a chaque fois que j'incrémente, je test la possibilités correspondant au tableau

        Et pour savoir où mon programme en est, j'affiche le tableau reference.

        Mais le programme est rapide (pour mon ordinateur) lorsque reference a une taille de 10 ou moins environ car il fini.

        Mais avec une plus grande taille, lorsque cela met du temps, mon ordinateur met "en pause" mon programme car il n'affiche plus les valeurs de reference aussi rapidement qu'au début.

        En revenant sur ce que tu vient de me dire, peut-être est-ce un problème de mémoire avec le terminal qui a affiché trop de valeurs de reference dont je n'ai plus besoin car je n'ai besoin que de la dernière valeur. Mais à ce moment là, comment puis-je vider le terminal de toutes ces valeurs inutiles ?

        Merci d'avance pour vos réponses

        -
        Edité par luckykamon 17 janvier 2018 à 14:55:28

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2018 à 15:01:02

          Le plus simple serait de tout mettre dans un fichier plutôt que d'afficher dans le terminal.

          Après tu peux regarder le défilement dans le fichier avec tail -f.

          Par contre c'est bizarre que le terminal ne gère pas ça mieux, est-ce que ton programme consomme pas trop de ram ? C'est facile de le savoir, il doit y avoir un gestionnaire de ressources / process sous Mac qui permet de voir les processus qui tournent sur la machine avec les ressources consommées.

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            17 janvier 2018 à 15:30:56

            Salut,

            Je viens de tester la solution de nolimitech avec htop et il s'agit bien de la mémoire:

            Je m'explique:

            Le terminal mémorise  en fait tout les prints qu'il a affiché mais il y en as trop donc il transfère la mémoire dans le swap. Ce passage prend du temps, ce qui ralenti le programme. Puis quand la mémoire swap est rempli elle se vide.

            (Voici une capture d'écran):

            De plus, LoupSolitaire, cela m'interresse toujours de voir l'avancement de mon programme.

            Donc si j'ai bien compris, tu me conseilles d'enregistrer le tout dans un fichier. (je sais comment faire)

            Du coup je pense le faire en réécrivant sur le fichier à chaque fois mais qu'est-ce que fait tail-f ?

            PS: Merci pour l'aide à vous deux

            Merci d'avance pour les nouvelles réponses

            • Partager sur Facebook
            • Partager sur Twitter
              17 janvier 2018 à 16:00:53

              Ça m'étonnerait que ce soit ton terminal, tous les terminaux qui se respectent ont une limite à leur scrollback. Tu devrais plutôt regarder la consommation mémoire de ton programme.

              Si c'est effectivement le terminal qui a un scrollback infini, alors c'est une mauvaise configuration et tu devrais le configurer ou en utiliser un autre.

              luckykamon a écrit:

              Du coup je pense le faire en réécrivant sur le fichier à chaque fois mais qu'est-ce que fait tail-f ?

              tail -f affiche le contenu du fichier, puis attend qu'il y ait de nouvelles écritures sur le fichier pour les afficher.

              Moi je te conseillerais plutôt de garder ta sortie standard telle qu'elle est actuellement, si tu veux rediriger vers un fichier tu n'as qu'à utiliser une redirection.

              -
              Edité par Mad scientist 17 janvier 2018 à 16:30:25

              • Partager sur Facebook
              • Partager sur Twitter
              Un vrai cours de: (C | C++ | Haskell débutant | Haskell intermédiaire | Rust).
                17 janvier 2018 à 16:38:43

                luckykamon a écrit:

                Donc si j'ai bien compris, tu me conseilles d'enregistrer le tout dans un fichier. (je sais comment faire)

                Du coup je pense le faire en réécrivant sur le fichier à chaque fois mais qu'est-ce que fait tail-f ?

                Pas réécrire le fichier à chaque fois, mais le garder ouvert et ajouter le nouveau tableau à la fin de fichier. Comme un fichier de log en fait.

                Sinon je suis d'accord avec le post d'au dessus, on voit pas sur ta capture quel programme bouffe la ram, mais c'est très possible que ce soit ton script.

                -
                Edité par LoupSolitaire 17 janvier 2018 à 16:39:27

                • Partager sur Facebook
                • Partager sur Twitter

                Blond, bouclé, toujours le sourire aux lèvres...

                  18 janvier 2018 à 17:20:48

                  Je viens de tester la solution avec le tail -f (où -f est le nom du fichier), qui fonctionne très bien, alors déjà merci à vous deux (Mad scientist et LoupSolitaire)

                  Maintenant, je vois un nouveau message apparaître dans le terminal qui ne m'a pas l'ai d'être un bon signe:

                   ALSA lib pcm.c:7963:(snd_pcm_recover) underrun occurred



                  De plus comme vous me l'indiquez, celà peut provenir d'un problème de mémoire dû a mon script.

                  Souhaitez-vous que je vous montre mon programme ? Ou pouvez-vous m'indiquez ce qui demande autant de mémoire ram en général ?

                  Je précise que j'utilise le module "pygame" pour mon interface graphique

                  Merci d'avance

                  (Mon problème se résout petit a petit, youpi ^^)

                  -
                  Edité par luckykamon 18 janvier 2018 à 17:34:06

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 janvier 2018 à 17:36:11

                    luckykamon a écrit:

                    Souhaitez-vous que je vous montre mon programme ? Ou pouvez-vous m'indiquez ce qui demande autant de mémoire ram en général ?

                    C'est mieux de donner la ou les parties de ton code qui sont susceptibles d'engendrer une consommation mémoire importante, en faisant attention à ne pas envoyer trop de code non plus pour faciliter la lecture du sujet. Si tu veux envoyer un long morceau de code, tu peux passer par pastebin (pour un fichier) ou github.

                    Sinon souvent ce qui peut consommer de la mémoire, c'est les collections de données: les listes, chaines, dictionnaires, … Tu peux passer par un debugger/profiler pour voir ce qu'il se passe étape par étape dans ton code.

                    luckykamon a écrit:

                     ALSA lib pcm.c:7963:(snd_pcm_recover) underrun occurred
                    Ce n'est pas grave, c'est juste un « décrochage » audio. Ça peut arriver quand le système audio ne peut pas honorer les demandes qui lui sont faites, par exemple si le système est surchargé.

                    -
                    Edité par Mad scientist 18 janvier 2018 à 17:44:15

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Un vrai cours de: (C | C++ | Haskell débutant | Haskell intermédiaire | Rust).
                      18 janvier 2018 à 19:07:56

                      Bon et bien j'ai trouvé le problème de mémoire grâce à "debugger", moi j'ai utilisé "pdb" pour ça.

                      Et ton indication sur le fait que ce sont les listes (moi c'est un tableau mais c'est analogue) qui demandent trop de mémoires m'a permit de corriger un problème, il s'agissait en fait d'un simple "append" en trop que j'avait laissé quand j'ai corrigé une autre erreur.

                      Actuellement je suis en train de faire tourner le programme (cela va surement durer toute la nuit) qui fonctionne déjà plus rapidement et en plus je peut utiliser mon ordinateur pendant ce temps car à cause du problème de ram mon ordinateur ramais (^^ le jeu de mots).

                      Donc merci à :

                      Mad scientist

                      LoupSolitaire

                      nolimitech

                      Je vous redit où cela en ait demain

                      -
                      Edité par luckykamon 18 janvier 2018 à 19:33:38

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 janvier 2018 à 19:35:55

                        Dans la fonction copie, savegrille1 passe par référence, donc elle grossit indéfiniment.

                        Elle est là ta fuite mémoire je pense.

                        EDIT : Grillé par l'édit, tant mieux si ça marche mieux maintenant.

                        -
                        Edité par LoupSolitaire 18 janvier 2018 à 19:36:55

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Blond, bouclé, toujours le sourire aux lèvres...

                          19 janvier 2018 à 13:49:52

                          Ouais, en fait je me suis rendu compte de l’erre en postant ce message

                          Au final, je n’ai pas eu d’erreur cette nui.

                          Donc merci à tous, mon problème est résolu 😁

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Arrêt de python lors d'un programme long

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown