Неустранимая ошибка Python: невозможно восстановить после переполнения стека
Я читал в Интернете аналогичную проблему, но ни один ответ мне не помог. У меня есть функция, которая для каждой строки данных (данные содержат около 2 000 000 строк) что-то делает, а затем вызывает ту же функцию с другим параметром в зависимости от того, что она сделала. Проблема в том, что через некоторое время я получаю эту ошибку в терминале: «Неустранимая ошибка Python: невозможно восстановить после переполнения стека». Кажется, что самой частой ошибкой, вызывающей эту ошибку, является бесконечный цикл, но я контролировал и не имею бесконечного цикла. Следовательно, для меня проблема в том, что для sys.getrecursionlimit () установлено значение 3000, что означает, что после 3000 вызовов той же функции она выдаст мне ошибку. Во-первых, я не понимаю разницы между «Неустранимая ошибка Python: невозможно восстановить после переполнения стека». в терминале или «RecursionError: максимальная глубина рекурсии превышена при сравнении» в jupyternotebook. На самом деле, для меня это может быть одна и та же ошибка (например, бесконечный цикл). При замене моей функции простой функцией под названием test_ у меня есть следующий код:
import sys print(sys.getrecursionlimit()) def test_(x,t): x = x+1 if x
3000 Никто -------------------------------------------------- ------------------------- RecursionError Traceback (последний вызов последний) in () 8 9 print (test_ (0,2971)) --- > 10 отпечатков (test_ (0,2972)) в test_ (x, t) 5 x = x + 1 6 if x 7 test_ (x = x, t = t) 8 9 print (test_ (0,2971)) . повторяется последний 1 кадр из кадра ниже . в test_ (x, t) 5 x = x + 1 6 if x 7 test_ (x = x, t = t) 8 9 print (test_ (0,2971)) RecursionError: максимальная глубина рекурсии превышена при сравнении
Чтобы решить эту проблему, я адаптировал функцию, не теряя «непрерывности выполнения», так что я могу использовать партии:
for i in np.arange(0,9000,2000): test_(i,i+2000)
Есть ли у кого-нибудь более хорошее решение? Кроме того, в общем, плохая идея - выполнять рекурсивную функцию, когда мы знаем, что нам нужно сделать много итераций? Также кто-нибудь знает, как я могу распечатать глубину рекурсии в каждом цикле? Я работаю над виртуальной средой Linux, с ноутбуком jupyter, на python 3.6 с anaconda.
Как избежать переполнения стека в Python 3
Примечание об отказе от ответственности: я абсолютно ничего не знаю о компьютерных науках и не имею никаких знаний о внутренней работе всего, что происходит за кулисами. Сам учусь программировать, используя все, что есть в Интернете.
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit(Intel)] on win32
Работая с обычным парсером, основной задачей которого является получение изображения полноразмерного URL-адреса изображения, сохранение его в файл для последующей загрузки, а затем переход к следующему изображению в строке, что в значительной степени является обязательным из-за плохой веб-архитектуры сайта в вопросе. Когда я закончил программу, я столкнулся с ошибкой в 976-й раз выполнения.
RuntimeError: maximum recursion depth exceeded in comparison
После исследования я обнаружил, что проблема связана с «переполнением стека». Однако в настоящее время я понятия не имею, как обойтись без значительного снижения производительности. (Хотя это не проблема, так как я делаю это только для учебы.)
Это подводит меня к моему вопросу, как я могу решить эту проблему и где я могу узнать больше о таких вещах, например, что такое Stack Overflow для начала?
(Программа работает нормально, переполнение стека останавливает это)
import requests from bs4 import BeautifulSoup def somesite_parsing(url): connection = requests.get(url) html = connection.text soup = BeautifulSoup(html, "html.parser") # The exception is necessary due to the web architecture. # Images that don't have different versions by size have an img tag. # Returns "http://www.somesite.net/tag_tag_tag.full.jpg" try: semi_link = soup.select("html > body > #wrapper > #body > #content > #large > a") full_link = semi_link[0].get("href") print(full_link) except IndexError: semi_link = soup.select("html > body > #wrapper > #body > #content > #large > img") full_link = semi_link[0].get("src") print(full_link) # File was created during testing so I switched to appending. # Saves link into folder. fx = open("list_file.txt", "a") fx.write(full_link + "\n") fx.close() # Fetches the next url. # Returns "/id_number" next_link = soup.select("html > body > #wrapper > #body > #menu > .smallthumbs > li > a") next_link = next_link[0].get("href") next_link = "http://www.somesite.net" + next_link print(next_link) print() somesite_parsing(next_link) somesite_parsing("http://www.somesite.net/1905220")
Что, черт возьми, такое переполнение стека
Я не говорю о stackoverflow, из которого вы копируете код для выполнения своей работы. Я говорю о том, что происходит, когда я пишу плохую рекурсию.
Итак, что такое переполнение стека?
В программном обеспечении переполнение стека происходит, если указатель стека вызовов превышает границу стека. Стек вызовов может состоять из ограниченного адресного пространства, часто определяемого в начале программы.
Перевод: программе выделен ограниченный объем памяти (стек вызовов). Когда это превышается (когда он переполняется), мы называем это переполнением стека.
Каждый раз, когда я видел это, это было результатом бесконечной рекурсии. Рекурсия - это когда метод / функция вызывает сам себя.
Иногда рекурсия является преднамеренной (например, итерация по графу). Иногда это происходит непреднамеренно (обратный вызов срабатывает сам).
Теперь давайте намеренно вызовем переполнение стека в Python, Ruby и Javascript.
Python
В вашем любимом редакторе кода переключитесь на python и запустите следующее.
def do_recursion(): do_recursion() do_recursion()
RecursionError: maximum recursion depth exceeded
Python выдает RecursionError , когда стек выходит за пределы.
Рубин
Переключите ваш редактор на Ruby и запустите его.
def do_recursion do_recursion end do_recursion
nodepad.rb:3:in `do_recursion': stack level too deep (SystemStackError)
Ruby бросает SystemStackError , когда уровень стека становится слишком глубоким.
JavaScript
Вы можете запустить это в консоли JS в хроме.
var do_recursion = function() < do_recursion() >do_recursion()
Uncaught RangeError: Maximum call stack size exceeded
Javascript выдает RangeError при превышении стека.
Заключение
И это настоящее переполнение стека.
Короче говоря, выделенная память превышена.
Вы не увидите это часто, если не напишете много рекурсивного кода. Но это хорошее понимание, которое нужно держать в своем арсенале.
ПЕРЕПОЛНЕНИЕ СТЕКА PYTHON
Переполнение стека в Python связано с использованием слишком большого количества памяти, чем может выдержать стек. Когда стек переполняется, то происходит ошибка, которую называют RecursionError.
RecursionError возникает в том случае, когда функция вызывает себя слишком много раз. Например:
def infinite_recursion(): infinite_recursion()
Этот код вызовет RecursionError, так как функция вызывает саму себя бесконечное количество раз. Чтобы избежать RecursionError, нужно убедиться, что функции, которые вызывают сами себя, имеют условие выхода из рекурсии.
Чтобы убедиться, что ваш код не вызывает RecursionError, вы можете увеличить максимальную глубину рекурсии Python. Это может быть сделано с помощью sys.setrecursionlimit(). Например:
Однако следует быть осторожным с изменением максимальной глубины рекурсии в Python, так как это может привести к проблемам с памятью.
Перезапись буфера на стеке (Stackoverflow) - Защита Stack Canary - Протекция стека
Python: основы и применение - 15 урок.Функции и стек вызовов
#15. Делаем очередь (queue) - Алгоритмы на Python
Сollections namedtuple python
Как происходит атака переполнение стека - Buffer Overflow
Hackerdom-12-03 Переполнение стека
#14. Стек типа LIFO (Last-In-First-Out) - Алгоритмы на Python
Структура данных Stack( LIFO). Задача \
- Python распознавание текста с pdf
- Как посмотреть код функции в python
- Олег молчанов python
- Flask или django
- Django 4 в примерах
- Python сглаживание графика
- Python условие в print
- Проверка подписки на канал телеграмм бот python
- Numpy скопировать массив
- Python матрица инцидентности
- Отключить предупреждения python
- Можно ли конструктор пометить c помощью модификатора virtual python
- Numpy eye что делает
- Python pycharm скачать
- Django rest framework регистрация