115 votes

Quelles sont les causes d'une erreur de segmentation de Python ?

Je suis en train d'implémenter l'algorithme de recherche de graphes Strong Connected Component (SCC) de Kosaraju en Python.

Le programme fonctionne parfaitement sur un petit ensemble de données, mais lorsque je l'exécute sur un très grand graphique (plus de 800 000 nœuds), il indique "Segmentation Fault" (erreur de segmentation).

Quelle pourrait en être la cause ? Nous vous remercions de votre attention.


Informations complémentaires : J'ai d'abord obtenu cette erreur lors de l'exécution de l'ensemble de données super-large :

"RuntimeError: maximum recursion depth exceeded in cmp"

Ensuite, j'ai réinitialisé la limite de récursivité en utilisant

sys.setrecursionlimit(50000)

mais a reçu un 'Segmentation fault' (erreur de segmentation)

Croyez-moi, il ne s'agit pas d'une boucle infinie, elle fonctionne correctement sur des données relativement petites. Il est possible que le programme ait épuisé les ressources ?

95voto

shiplu.mokadd.im Points 28895

Cela se produit lorsqu'un python extension (écrit en C) tente d'accéder à une mémoire hors de portée.

Vous pouvez le retracer de la manière suivante.

  • Ajouter sys.settrace à la toute première ligne du code.
  • Utilisation gdb tel que décrit par Marque en cette réponse .. A l'invite de commande

    gdb python
    (gdb) run /path/to/script.py
    ## wait for segfault ##
    (gdb) backtrace
    ## stack trace of the c code

66voto

Davide Points 5091

Je comprends que vous avez résolu votre problème, mais pour les autres qui lisent ce fil, voici la réponse : vous devez augmenter la pile que votre système d'exploitation alloue au processus python.

La manière de procéder dépend du système d'exploitation. Sous linux, vous pouvez vérifier avec la commande ulimit -s votre valeur actuelle et vous pouvez l'augmenter avec ulimit -s <new_value>

Essayez de doubler la valeur précédente et continuez à la doubler si cela ne fonctionne pas, jusqu'à ce que vous trouviez une valeur qui fonctionne ou que vous soyez à court de mémoire.

27voto

Allforgood Points 21

Le défaut de segmentation est un défaut générique qui peut avoir de nombreuses causes :

  • Mémoire faible
  • Mémoire Ram défectueuse
  • Récupération d'un grand ensemble de données dans la base de données à l'aide d'une requête (si la taille des données récupérées est supérieure à la mémoire d'échange).
  • mauvaise requête / code bogué
  • avoir une boucle longue (récursion multiple)

5voto

Rock Points 24

La mise à jour de l'ulimit a fonctionné pour l'implémentation du SCC de Kosaraju en corrigeant le défaut de segmentation sur les implémentations Python (défaut de segmentation Python qui l'eût cru !) et C++.

Pour mon MAC, j'ai trouvé le maximum possible via :

$ ulimit -s -H
65532

4voto

llinfeng Points 481

Une recherche sur Google m'a permis de trouver cet article, et je n'ai pas vu la "solution personnelle" suivante discutée.


Mon récent désagrément avec Python 3.7 sur Windows Subsystem for Linux est que : sur deux machines avec la même bibliothèque Pandas, l'une me donne segmentation fault et les autres rapports avertissent. Il n'était pas clair lequel était le plus récent, mais "réinstaller" pandas résout le problème.

Commande que j'ai exécutée sur la machine buggy.

conda install pandas

Plus d'informations : J'exécutais des scripts identiques (synchronisés via Git), et les deux sont des machines Windows 10 avec WSL + Anaconda. Voici les captures d'écran pour illustrer mon propos. Aussi, sur la machine où la ligne de commande python se plaindra de Segmentation fault (core dumped) Jupyter lab redémarre simplement le noyau à chaque fois. Pire encore, aucun avertissement n'a été donné.

enter image description here


Mise à jour quelques mois plus tard : J'ai arrêté d'héberger des serveurs Jupyter sur une machine Windows. J'utilise maintenant WSL sur Windows pour récupérer les ports distants ouverts sur un serveur Linux et exécuter tous mes travaux sur la machine Linux distante. Je n'ai jamais rencontré d'erreur d'exécution depuis de nombreux mois :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X