web-dev-qa-db-fra.com

Qu'est-ce qui cause une erreur de segmentation Python?

J'implémente l'algorithme de recherche de graphes SCC (Strong Connected Component) de Kosaraju en Python.

Le programme fonctionne très bien sur de petits ensembles de données, mais lorsque je l’exécute sur un très gros graphique (plus de 800 000 nœuds), il indique "Erreur de segmentation".

Quelle pourrait en être la cause? Je vous remercie!


Informations additionnelles: J'ai tout d'abord eu cette erreur lors de l'exécution sur le très grand ensemble de données:

"RuntimeError: maximum recursion depth exceeded in cmp"

Ensuite, je réinitialise la limite de récursivité à l'aide de

sys.setrecursionlimit(50000)

mais a eu une 'faute de segmentation'

Croyez-moi, ce n'est pas une boucle infinie, elle fonctionne correctement sur des données relativement plus petites. Il est possible que le programme a épuisé les ressources?

64
xiaolong

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

Vous pouvez le suivre de différentes manières.

  • Ajoutez sys.settrace à la toute première ligne du code.
  • Utilisez gdb comme décrit par Mark dans cette réponse .. À l'invite de commande

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

Je comprends que vous ayez résolu votre problème, mais pour les autres lecteurs de ce fil, la réponse est la suivante: vous devez augmenter la pile allouée par votre système d’exploitation au processus python.

La façon de le faire 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 à doubler si cela ne fonctionne pas, jusqu'à ce que vous en trouviez un qui fonctionne ou que vous manquiez de mémoire.

46
Davide

La segmentation est générique, il y a plusieurs raisons possibles à cela:

  • Peu de mémoire
  • Mémoire RAM défectueuse
  • Récupérer un grand ensemble de données de la base de données en utilisant une requête (si la taille des données extraites est supérieure à swap mem
  • mauvais code de requête/buggy
  • ayant une longue boucle (récursion multiple)
10
Sadheesh

La mise à jour de ulimit a fonctionné pour l’implémentation de SCC de mon Kosaraju en corrigeant le segfault sur les implémentations Python (segfault .. qui connaissait!) Et C++. 

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

$ ulimit -s -H
65532
1
Rock

Je rencontrais cette erreur de segmentation après la mise à niveau de dlib sur RPI. J'ai tracé la pile comme suggéré par Shiplu Mokaddim ci-dessus et il s'est installé sur une bibliothèque OpenBLAS.

Etant donné qu'OpenBLAS est également multithread, son utilisation dans une application multithread multiplie de manière exponentielle les threads jusqu'à ce que la segmentation échoue. Pour les applications multi-thread, définissez OpenBlas sur le mode mono-thread.

Dans un environnement virtuel python, indiquez à OpenBLAS de n'utiliser qu'un seul thread en modifiant:

    $ workon <myenv>
    $ nano .virtualenv/<myenv>/bin/postactivate

et ajouter:

    export OPENBLAS_NUM_THREADS=1 
    export OPENBLAS_MAIN_FREE=1

Après le redémarrage, j’ai pu exécuter toutes mes applications de reconnaissance d’images sur rpi3b qui le bloquaient auparavant.

référence: https://github.com/ageitgey/face_recognition/issues/294

0
Digitalf8

La recherche Google m'a trouvé cet article et je n'ai pas vu la "solution personnelle" suivante discutée.


Ma récente contrariété avec Python 3.7 sur Windows Subsystem for Linux est la suivante: sur deux ordinateurs avec la même bibliothèque Pandas, l’un me donne segmentation fault et l’autre avertit. On ne savait pas 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 de détails: J'exécutais des scripts identiques (synchronisés via Git) et les deux sont des ordinateurs Windows 10 avec WSL + Anaconda. Voici les captures d'écran pour faire l'affaire. De même, 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

0
llinfeng