2010-01-14 9 views
5

사용자 정의 빌드 된 DLL을 사용하는 파이썬 프로그램이 있습니다. 이 DLL은 스택 오버플로로 인해 충돌합니다. 이 오버플로는 재귀 함수가 잘못 되었기 때문에가 아니라 alloca()를 사용하는 스택의 큰 할당 때문입니다.어떻게 파이썬 스택 크기를 늘릴 수

이 오류를 없애기 위해 스택 크기를 늘리고 싶습니다. 이 일을 할 수있는 방법이 있습니까?

+0

소스 코드를 변경할 수있는 경우 (http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script DLL을 –

답변

2

AFAIK 프로그램은 새 스레드 또는 프로세스의 스택 크기 만 변경할 수 있습니다 (예 : Windows 'CreateThread 기능). Python (및 Python 용 Win32 API)이 그러한 기능을 드러내지 않으므로 스택 할당을 힙 메모리로 대체해야합니다. 아니면 스택을 사용하는 구체적인 이유가 무엇입니까 ?? 실제로 alloca을 사용하려면이 있어야합니다. DLL 코드를 실행하기 위해 별도의 스레드를 만들 수 있습니다 (이는 과잉이라고 생각합니다).

편집 : 보정 - 새 스레드를 만들 때 스택 크기를 설정하는 파이썬 thread module는 새로운 스레드에 대한 새로운 stack size을 지정할 수 있습니다

+0

ODE 엔진을 참조) 큰 행렬 계산 속도를 높이기 위해 alloca를 사용합니다. 다행히 malloc으로 전환 할 수있는 컴파일 플래그가 있습니다. 조금 느리지 만 작동합니다. 감사! –

2

dll의 함수는 실행시 사용할 수있는 스택 크기를 제어 할 수 없습니다 (라이브러리 제어하에 새 스레드를 생성하지 않는 한).

dll이 사용자 지정이면 스택 (또는 정적으로 할당)보다는 힙에 할당 할 수 없으며 그런 식으로 문제를 중지 할 수 있습니까?

6

(thread.stack_size 참조) 파이썬은 할 수 없습니다. 충분히 큰 값으로 설정 한 다음 새 스레드에서이 DLL의 작업을 수행하십시오.

2

관련 질문 중 하나 인 like here에 나와 있듯이 일반적으로 스택 크기를 사용하여 재귀 깊이를 확장하는 것은 좋지 않지만 스택을 확장하는 방법을 보여주는 코드는 여기에 있습니다. 파이썬 3.5에서는 Windows 10 x64 시스템에서 일반적으로 불가능한 아주 깊은 재귀를 보여줍니다 (내 상황에서는 일반적으로 허용되는 재귀 제한이 993 인 것으로 나타남). 나는 실제로 얼마나 큰 스택인지는 모르겠지만 아래에 지정된 크기의 절반으로 파이썬이 충돌합니다.

import sys 
import threading 

class SomeCallable: 
    def __call__(self): 
     try: 
      self.recurse(99900) 
     except RecursionError: 
      print("Booh!") 
     else: 
      print("Hurray!") 
    def recurse(self, n): 
     if n > 0: 
      self.recurse(n-1) 

SomeCallable()() # recurse in current thread 

# recurse in greedy thread 
sys.setrecursionlimit(100000) 
threading.stack_size(0x2000000) 
t = threading.Thread(target=SomeCallable()) 
t.start() 
t.join() 

`

관련 문제