Что вызывает ошибку сегментации Python?
Я реализую алгоритм поиска графического алгоритма Kosaraju Strong Connected Component (SCC) в Python.
Программа отлично работает на небольшом наборе данных, но когда я запускаю ее на супербольшой график (более 800 000 узлов), в нем говорится "Ошибка сегментации".
Что может быть причиной этого? Спасибо!
Дополнительная информация:
Сначала я получил эту ошибку при работе с супербольшим набором данных:
"RuntimeError: maximum recursion depth exceeded in cmp"
Тогда я reset предел рекурсии с использованием
sys.setrecursionlimit(50000)
но получил "Ошибка сегментации"
Поверьте, это не бесконечный цикл, он работает правильно относительно относительно небольших данных. Возможно, программа исчерпала ресурсы?
Ответы
Ответ 1
Это происходит, когда расширение python (написанное на C) пытается получить доступ к памяти за пределами досягаемости.
Вы можете проследить его следующим образом.
- Добавить
sys.settrace
в самой первой строке кода.
-
Используйте gdb
, как описано Марк в этот ответ. В командной строке
gdb python
(gdb) run /path/to/script.py
## wait for segfault ##
(gdb) backtrace
## stack trace of the c code
Ответ 2
Я понимаю, что вы решили свою проблему, но для других, читающих этот поток, вот ответ: вам нужно увеличить стек, который ваша операционная система выделяет для процесса python.
Способ сделать это, зависит от операционной системы. В linux вы можете проверить с помощью команды ulimit -s
текущее значение, и вы можете увеличить его с помощью ulimit -s <new_value>
Попробуйте удвоить предыдущее значение и продолжить удвоение, если оно не работает, пока не найдете тот, который делает или не хватает памяти.
Ответ 3
Ошибка сегментации является общей, есть много возможных причин для этого:
- Мало памяти
- Неисправная память ОЗУ
- Извлечение огромного набора данных из БД с помощью запроса (если размер извлеченных данных превышает размер swap mem)
- неправильный запрос/код ошибки
- с длинной петлей (многократная рекурсия)
Ответ 4
Обновление ulimit для моей реализации SCC в Kosaraju путем исправления segfault для обоих Python (Python segfault.., которые знали!) и реализаций С++.
Для моего MAC я узнал возможный максимум через:
$ ulimit -s -H
65532
Ответ 5
Поиск Google нашел мне эту статью, и я не увидел, что обсуждается следующее "личное решение".
Мое недавнее недовольство Python 3.7 в подсистеме Windows для Linux таково: на двух машинах с одной библиотекой Pandas один выдает мне segmentation fault
, а другие выдают предупреждение. Было неясно, какой из них был новее, но "переустановка" pandas
решает проблему.
Команда, которую я выполнил на машине с ошибками.
conda install pandas
Подробнее: я запускал идентичные сценарии (синхронизированные через Git), и оба они - машина Windows 10 с WSL + Anaconda. Здесь идут скриншоты, чтобы сделать дело. Кроме того, на компьютере, где командная строка python
будет жаловаться на Segmentation fault (core dumped)
, лаборатория Jupyter просто перезапускает ядро каждый раз. Хуже того, предупреждение не было дано вообще.
![enter image description here]()
Обновления спустя несколько месяцев: я перестал размещать серверы Jupyter на компьютере с Windows. Теперь я использую WSL в Windows для извлечения удаленных портов, открытых на сервере Linux, и запускаю все свои задания на удаленном компьютере с Linux. Я никогда не сталкивался ни с какой ошибкой исполнения в течение целого ряда месяцев :)
Ответ 6
Я столкнулся с этой ошибкой сегментации после обновления dlib на RPI.
Я отследил стек, как было предложено Шиплу Мокаддимом выше, и он остановился на библиотеке OpenBLAS.
Поскольку OpenBLAS также является многопоточным, использование его в многопоточном приложении будет экспоненциально умножать потоки до ошибки сегментации. Для многопоточных приложений установите OpenBlas в однопоточный режим.
В виртуальной среде Python скажите, что OpenBLAS будет использовать только один поток, отредактировав:
$ workon <myenv>
$ nano .virtualenv/<myenv>/bin/postactivate
и добавьте:
export OPENBLAS_NUM_THREADS=1
export OPENBLAS_MAIN_FREE=1
После перезагрузки я смог запустить все приложения для распознавания изображений на rpi3b, которые ранее его сбивали.
ссылка:https://github.com/ageitgey/face_recognition/issues/294