2010-01-14 3 views
5

У меня есть программа python, которая использует настраиваемую DLL. Эта DLL сбой из-за переполнения стека. Это переполнение происходит не из-за неудачной рекурсивной функции, а для больших распределений в стеке с помощью alloca().Как увеличить размер стека в python

Я хочу увеличить размер стека, чтобы избавиться от этой ошибки. Есть какой-либо способ сделать это?

+0

Если вы можете изменить исходный код, см http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

ответ

2

AFAIK Программа может изменять размер стека только новых потоков или процессов (например, Windows 'CreateThread). Поскольку Python (и API Win32 для Python) не раскрывает такую ​​функциональность, лучше заменить распределение стека кучей памяти. Или есть конкретная причина для использования стека? Если у вас действительно есть, чтобы использовать alloca, возможно, вы захотите создать отдельный поток для выполнения DLL-кода (что, по-моему, слишком велико).

EDIT: Correction - Python действительно позволяет для установки размера стека при создании темы (см thread.stack_size)

+0

оде двигателя (DLL что вызывает проблему) использует alloca для ускорения больших матричных вычислений. К счастью, у него есть флаг компиляции, который позволяет мне переключать его на malloc. Это немного медленнее, но это работает. Благодаря! –

2

Функции в dll не могут контролировать размер стека, доступный при их выполнении (если только вы не создаете новые потоки под управлением вашей библиотеки).

Если dll является обычным, тогда вы не можете выделять кучу, а не стек (или статически выделять, если это необходимо) и останавливать проблему таким образом?

6

Питон thread module позволяет задать новый stack size для новых потоков. Попробуйте установить это значение, которое вы считаете достаточно большим, а затем выполните работу с этой DLL в новом потоке.

2

Как указано в некоторых связанных вопросах like here, обычно не рекомендуется играть с размером стека, чтобы расширить глубину рекурсии, но вот код, который показывает, как вырастить стек для этого эффекта. С python 3.5 в Windows 10 x64 система демонстрирует очень глубокую рекурсию, которая обычно невозможна (обычно допустимый предел рекурсии в моей ситуации составляет 993). Я не знаю, насколько большой стек на самом деле должен быть, но с половиной размера, указанного ниже, сбой python.

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

`

Смежные вопросы