web-dev-qa-db-ja.com

致命的Pythonエラー:スタックオーバーフローから回復できません

私はインターネットで同様の問題を読みましたが、答えのどれも私を助けることができませんでした。データの各行(データには約2'000'000行)に対して何かを実行し、実行内容に応じて異なるパラメーターを使用して同じ関数を呼び出す関数があります。問題は、しばらくするとターミナルで次のエラーが発生することです: '致命的Pythonエラー:スタックオーバーフローから回復できません。'

このエラーの原因となる最も頻繁な間違いは無限ループであると思われますが、私は制御し、無限ループはありません。したがって、私にとっては、「sys.getrecursionlimit()」が3000に設定されているという問題があります。これは、同じ関数を3000回呼び出した後、エラーが発生することを意味します。

まず、ターミナルの「致命的Pythonエラー:スタックオーバーフローから回復できません。」」と「RecursionError:比較して最大再帰深度を超えました」の違いがわかりません。確かに、私にとっては、同じ間違い(無限ループなど)が原因である可能性があります。

関数を「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

None

-------------------------------------------------- ------------------------- RecursionError Traceback(最後の最後の呼び出し)in()8 9 print(test_(0,2971))--- > 10 print(test_(0,2972))

in test_(x、t)5 x = x + 1 6 if x 7 test_(x = x、t = t)8 9 print(test_(0,2971))

...最後の1フレームが繰り返され、下のフレームから.。

in 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)

誰かがより良い解決策を持っているでしょうか?また、一般に、反復がたくさんあることがわかっているときに再帰関数を実行するのは悪い考えですか?また、各ループでrecursiondeepthを出力する方法を知っている人はいますか?

私は、jupyterノートブックを使用したLinux仮想環境で、anacondaを使用したpython 3.6で作業しています。

4
miki

この質問を確認してください(私にとってはうまくいきました): 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
3
Elad

私の問題は、接続が悪いときにAPIにリクエストを送信することでした。 bot.polling()メソッドを使用したライブラリだったので、リクエストがオーバーフローしたか何かかもしれません。

0
parsecer