Что вызывает ошибку сегментации 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