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?
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.
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
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.
La segmentation est générique, il y a plusieurs raisons possibles à cela:
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
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
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é.