Estoy implementando el algoritmo de búsqueda de gráficos del Componente Conectado Fuerte (SCC) de Kosaraju en Python.
El programa funciona muy bien en un conjunto de datos pequeño, pero cuando lo ejecuto en un gráfico supergrande (más de 800.000 nodos), dice "Fallo de segmentación".
¿Cuál podría ser la causa? ¡Gracias!
Información adicional: Primero recibí este error al ejecutar el conjunto de datos supergrande:
"RuntimeError: maximum recursion depth exceeded in cmp"
Luego restablezco el límite de recursividad usando
sys.setrecursionlimit(50000)
pero tiene una 'falla de segmentación'
Créame, no es un bucle infinito, funciona correctamente con datos relativamente más pequeños. ¿Es posible que el programa haya agotado los recursos?
python
segmentation-fault
large-data
Xiaolong
fuente
fuente
Respuestas:
Esto sucede cuando una extensión de Python (escrita en C) intenta acceder a una memoria fuera de su alcance.
Puede rastrearlo de las siguientes maneras.
sys.settrace
en la primera línea del código.Use
gdb
como lo describe Mark en esta respuesta . En el símbolo del sistemagdb python (gdb) run /path/to/script.py ## wait for segfault ## (gdb) backtrace ## stack trace of the c code
fuente
Entiendo que ha resuelto su problema, pero para otros que lean este hilo, aquí está la respuesta: debe aumentar la pila que su sistema operativo asigna para el proceso de Python.
La forma de hacerlo depende del sistema operativo. En linux, puede verificar con el comando
ulimit -s
su valor actual y puede aumentarlo conulimit -s <new_value>
Intente duplicar el valor anterior y continúe duplicando si no funciona, hasta que encuentre uno que funcione o se quede sin memoria.
fuente
lsof
y usargrep
owc -l
hacer un seguimiento de todo.La falla de segmentación es genérica, hay muchas razones posibles para esto:
fuente
La actualización de ulimit funcionó para la implementación de SCC de mi Kosaraju al corregir la falla de segmentación en las implementaciones de Python (Python segfault ... ¡quién sabía!) Y C ++.
Para mi MAC, descubrí el máximo posible a través de:
$ ulimit -s -H 65532
fuente
La búsqueda de Google me encontró este artículo y no vi la siguiente "solución personal" discutida.
Mi molestia reciente con Python 3.7 en el subsistema de Windows para Linux es que: en dos máquinas con la misma biblioteca de Pandas, una me da a mí
segmentation fault
y la otra informa de advertencia. No estaba claro cuál era más nuevo, pero "reinstalar"pandas
resuelve el problema.Comando que corrí en la máquina con errores.
Más detalles: estaba ejecutando scripts idénticos (sincronizados a través de Git), y ambos son una máquina Windows 10 con WSL + Anaconda. Aquí van las capturas de pantalla para hacer el caso. Además, en la máquina sobre la que
python
se quejará la línea de comandosSegmentation fault (core dumped)
, Jupyter lab simplemente reinicia el kernel cada vez. Peor aún, no se dio ninguna advertencia.Actualizaciones unos meses después: dejé de alojar servidores Jupyter en una máquina con Windows. Ahora uso WSL en Windows para buscar puertos remotos abiertos en un servidor Linux y ejecutar todos mis trabajos en la máquina Linux remota. Nunca he experimentado ningún error de ejecución durante una buena cantidad de meses :)
fuente
Estaba experimentando esta falla de segmentación después de actualizar dlib en RPI. Rastreé la pila como sugirió Shiplu Mokaddim arriba y se instaló en una biblioteca OpenBLAS.
Dado que OpenBLAS también tiene varios subprocesos, su uso en una aplicación de subprocesos múltiples multiplicará exponencialmente los subprocesos hasta que falle la segmentación. Para aplicaciones multiproceso, configure OpenBlas en modo de un solo hilo.
En el entorno virtual de Python, dígale a OpenBLAS que solo use un único hilo editando:
y añadir:
export OPENBLAS_NUM_THREADS=1 export OPENBLAS_MAIN_FREE=1
Después de reiniciar, pude ejecutar todas mis aplicaciones de reconocimiento de imágenes en rpi3b que anteriormente lo estaban bloqueando.
referencia: https://github.com/ageitgey/face_recognition/issues/294
fuente
Parece que no tienes memoria de pila. Es posible que desee aumentarlo como dijo Davide. Para hacerlo en código Python, necesitaría ejecutar su "main ()" usando subprocesos:
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()
Fuente: publicación de c1729 sobre codeforces . Ejecutarlo con PyPy es un poco más complicado .
fuente