12

MacOS10.7.3でPython2.7.2を使用しています

私は50000以上の再帰レベルでPythonで再帰アルゴリズムを実行しています。

最大再帰レベルを1000000に上げようとしましたが、Pythonシェルは18000再帰レベルの後も終了します。

利用可能なリソースを増やしてみました:

import resource 
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)

そして私はこのエラーを受け取ります:

Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    resource.setrlimit(resource.RLIMIT_STACK,(2**29,-1))
ValueError: not allowed to raise maximum limit

上限を上げられない理由がわかりませんか?

あなたの提案に感謝します。

4

2 に答える 2

6

Pythonのドキュメントから:

無効なリソースが指定された場合、新しいソフト制限がハード制限を超えた場合、またはプロセスがハード制限を引き上げようとした場合(プロセスにスーパーユーザーの有効なUIDがない場合)、ValueErrorが発生します。基盤となるシステムコールが失敗した場合にもエラーが発生する可能性があります。

このことから、あなたの試みの新しいソフト制限は大きすぎると思います。おそらく、反復するようにアルゴリズムを書き直す必要があります。Pythonは、このような大規模な再帰を処理するようには実際には設計されていません。

于 2012-04-14T16:44:06.487 に答える
3

より効率的なアルゴリズムを作成することをお勧めしますが、Pythonをrootとして実行することでハード制限を引き上げることができます(ドキュメントに記載されています)。

として実行する場合root、次の行で実際にスタックサイズを無制限に設定できます。

import resource
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
于 2012-08-28T14:25:37.003 に答える