2012-04-14 11 views
7

Używam Pythona 2.7.2 na Mac OS 10.7.3Python ValueError: nie wolno podnieść maksymalny limit

Robię rekurencyjny algorytm w Pythonie z ponad 50 000 poziomów rekursji.

Próbowałem zwiększyć maksymalny poziom rekurencji do 1 000 000, ale mój python shell wciąż zjazd po 18 000 poziomów rekursji.

Próbowałem zwiększyć dostępne zasoby:

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

i otrzymuję ten błąd:

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 

nie wiem dlaczego nie mogę podnieść maksymalny limit?

dzięki za sugestie.

+0

która wersja/OS? – fabrizioM

Odpowiedz

6

Z dokumentacji Pythona:

Raises ValueError if an invalid resource is specified, if the new soft limit exceeds the hard limit, or if a process tries to raise its hard limit (unless the process has an effective UID of super-user). Can also raise error if the underlying system call fails.

Stąd myślę, że próba nowy miękki granica jest zbyt duża. Prawdopodobnie musisz przerobić algorytm na iteracyjny. Python nie został zaprojektowany tak, aby obsługiwać tak masywną rekursję.

+0

thx, zrobiłem to iteracyjnie, python nie jest przeznaczony dla tak dużego algorytmu rekursywnego –

1

Chociaż to chyba lepszy pomysł, aby napisać bardziej sprawna algo można podnieść sztywny limit uruchamiając Pythona jako root (jak wspomniano w docs).

Jeśli wykonać jako root, rzeczywiście można ustawić rozmiar stosu nieograniczony z następującą linię:

import resource 
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) 
Powiązane problemy