Ich implementiere Kosarajus SCC-Diagrammsuchalgorithmus (Strong Connected Component) in Python.
Das Programm läuft hervorragend auf kleinen Datenmengen, aber wenn ich es auf einem super großen Diagramm (mehr als 800.000 Knoten) ausführe, heißt es "Segmentierungsfehler".
Was könnte die Ursache dafür sein? Vielen Dank!
Zusätzliche Informationen: Zuerst habe ich diesen Fehler beim Ausführen des sehr großen Datensatzes erhalten:
"RuntimeError: maximum recursion depth exceeded in cmp"
Dann setze ich das Rekursionslimit mit zurück
sys.setrecursionlimit(50000)
habe aber einen 'Segmentierungsfehler'
Glauben Sie mir, es ist keine Endlosschleife, sie läuft korrekt mit relativ kleinen Daten. Ist es möglich, dass das Programm die Ressourcen erschöpft hat?
python
segmentation-fault
large-data
Xiaolong
quelle
quelle
Antworten:
Dies geschieht, wenn eine Python- Erweiterung (in C geschrieben) versucht, auf einen Speicher außerhalb der Reichweite zuzugreifen.
Sie können es auf folgende Arten verfolgen.
sys.settrace
in der ersten Zeile des Codes hinzu.Verwenden Sie
gdb
wie in dieser Antwort von Mark beschrieben . An der Eingabeaufforderunggdb python (gdb) run /path/to/script.py ## wait for segfault ## (gdb) backtrace ## stack trace of the c code
quelle
Ich verstehe, dass Sie Ihr Problem gelöst haben, aber für andere, die diesen Thread lesen, ist hier die Antwort: Sie müssen den Stapel erhöhen, den Ihr Betriebssystem für den Python-Prozess zuweist.
Die Vorgehensweise hängt vom Betriebssystem ab. Unter Linux können Sie mit dem Befehl
ulimit -s
Ihren aktuellen Wert überprüfen und mit erhöhenulimit -s <new_value>
Versuchen Sie, den vorherigen Wert zu verdoppeln, und verdoppeln Sie ihn weiter, wenn er nicht funktioniert, bis Sie einen finden, der nicht mehr über genügend Speicher verfügt.
quelle
lsof
und zu verwendengrep
oderwc -l
den Überblick zu behalten.Der Segmentierungsfehler ist generisch. Dafür gibt es viele mögliche Gründe:
quelle
Das Aktualisieren des ulimit funktionierte für die SCC-Implementierung meines Kosaraju, indem der Segfault sowohl bei Python- (Python-Segfault .. wer wusste!) Als auch bei C ++ - Implementierungen behoben wurde.
Für meinen MAC habe ich das mögliche Maximum herausgefunden über:
$ ulimit -s -H 65532
quelle
Die Google-Suche hat mir diesen Artikel gefunden, und ich habe die folgende "persönliche Lösung" nicht besprochen.
Mein jüngster Ärger mit Python 3.7 unter Windows Subsystem für Linux ist folgender: Auf zwei Computern mit derselben Pandas-Bibliothek gibt einer
segmentation fault
und der andere eine Warnung aus. Es war nicht klar, welches neuer war, aber "Neuinstallation"pandas
löst das Problem.Befehl, den ich auf dem Buggy ausgeführt habe.
Weitere Details: Ich habe identische Skripte ausgeführt (über Git synchronisiert) und beide sind Windows 10-Computer mit WSL + Anaconda. Hier gehen die Screenshots, um den Fall zu machen. Auf dem Computer, über den sich die Befehlszeile
python
beschwertSegmentation fault (core dumped)
, startet Jupyter Lab den Kernel einfach jedes Mal neu. Schlimmer noch, es wurde überhaupt keine Warnung gegeben.Updates einige Monate später: Ich habe das Hosting von Jupyter-Servern auf einem Windows-Computer beendet. Ich verwende jetzt WSL unter Windows, um auf einem Linux-Server geöffnete Remote-Ports abzurufen und alle meine Jobs auf dem Remote-Linux-Computer auszuführen. Ich habe seit einigen Monaten keinen Ausführungsfehler mehr festgestellt :)
quelle
Ich habe diesen Segmentierungsfehler nach dem Upgrade von dlib auf RPI festgestellt. Ich habe den Stapel zurückverfolgt, wie oben von Shiplu Mokaddim vorgeschlagen, und er hat sich in einer OpenBLAS-Bibliothek niedergelassen.
Da OpenBLAS auch Multithread-fähig ist, multipliziert die Verwendung in einer Anwendung mit mehreren Threads die Threads exponentiell bis zum Segmentierungsfehler. Stellen Sie OpenBlas für Multithread-Anwendungen auf den Single-Thread-Modus ein.
Weisen Sie OpenBLAS in einer virtuellen Python-Umgebung an, nur einen einzigen Thread zu verwenden, indem Sie Folgendes bearbeiten:
und hinzufügen:
export OPENBLAS_NUM_THREADS=1 export OPENBLAS_MAIN_FREE=1
Nach dem Neustart konnte ich alle meine Bilderkennungs-Apps auf rpi3b ausführen, die zuvor abstürzten.
Referenz: https://github.com/ageitgey/face_recognition/issues/294
quelle
Sieht so aus, als hätten Sie keinen Stapelspeicher mehr. Vielleicht möchten Sie es erhöhen, wie Davide sagte. Um dies in Python-Code zu tun, müssten Sie "main ()" mithilfe von Threading ausführen:
def main(): pass # write your code here sys.setrecursionlimit(2097152) # adjust numbers threading.stack_size(134217728) # for your needs main_thread = threading.Thread(target=main) main_thread.start() main_thread.join()
Quelle: c1729s Beitrag über Codeforces . Das Ausführen mit PyPy ist etwas schwieriger .
quelle