Неустранимая ошибка Python: не удается восстановить после переполнения стека - PullRequest
0 голосов
/ 24 мая 2018

Я прочитал в интернете похожую проблему, но ни один из ответов мне не помог.У меня есть функция, которая для каждой строки данных (данные имеют около 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<t:
        test_(x=x,t=t)

print(test_(0,2971)) # output: None
print(test_(0,2972)) # RecursionError: maximum recursion depth exceeded in comparison

3000

Нет

--------------------------------------------------------------------------- RecursionError Traceback (последний вызов последний) in () 8 9 print (test_ (0,2971)) ---> 10 print (test_ (0,2972))

in test_ (x, t) 5 x = x + 1 6, еслиx 7 test_ (x = x, t = t) 8 9 отпечаток (test_ (0,2971))

... повторяются последние 1 кадр из кадра ниже ...

в test_ (x, t) 5 x = x + 1 6, если 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.

1 Ответ

0 голосов
/ 24 мая 2018

Пожалуйста, проверьте этот вопрос (он работал для меня): Как мне узнать текущую глубину стека интерпретаторов Python?

ваш код на основе этого ответа:

import sys
import inspect
print(sys.getrecursionlimit())

def test_(x,t):
    print len(inspect.stack())
    x = x+1
    if x<t:
        test_(x=x,t=t)

print(test_(0,7))

вывод:

22
23
24
25
26
27
28
None
...