2010-01-14 67 views
5

Tengo un programa de Python que usa una DLL personalizada. Este DLL falla debido a un desbordamiento de la pila. Este desbordamiento no se debe a una función recursiva que salió mal, sino a asignaciones grandes en la pila usando alloca().¿Cómo puedo aumentar el tamaño de la pila en Python?

Quiero aumentar el tamaño de la pila para eliminar este error. ¿Hay alguna manera de hacer esto?

+0

Si puede cambiar el código fuente, consulte http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

Respuesta

2

AFAIK un programa solo puede cambiar el tamaño de la pila de nuevos subprocesos o procesos (función de Windows CreateThread, por ejemplo). Como Python (y la API de Win32 para Python) no expone dicha funcionalidad, debería reemplazar la asignación de la pila con la memoria del montón. ¿O hay una razón específica para usar la pila? Si realmente tiene para usar alloca es posible que desee crear un hilo separado para la ejecución del código DLL (que es excesivo, creo).

EDIT: corrección - Python sí permite ajustar el tamaño de la pila al crear nuevos temas (ver thread.stack_size)

+0

El motor ODE (DLL que causa el problema) usa alloca para acelerar los cálculos de matriz grande. Afortunadamente, tiene una bandera de compilación que me permite cambiarla a malloc. Es un poco más lento, pero funciona. ¡Gracias! –

2

Las funciones en un dll no pueden tener control sobre el tamaño de la pila disponible cuando se ejecutan (a menos que genere nuevos hilos bajo el control de su biblioteca).

Si el dll es personalizado, ¿no puede asignar en el montón en lugar de acumular (o asignar estáticamente, si corresponde) y detener el problema de esa manera?

6

La pitón thread module le permite especificar un nuevo stack size de nuevos temas. Intente configurar eso en un valor que considere suficientemente grande y luego haga el trabajo de esta DLL en un nuevo hilo.

2

Como se señala en algunas preguntas relacionadas like here, generalmente no es una buena idea jugar con el tamaño de pila para extender la profundidad de recursión, pero aquí hay un código que muestra cómo hacer crecer la pila para ese efecto. Con Python 3.5, en un sistema Windows 10 x64, demuestra una recursión muy profunda que normalmente es imposible (el límite de recursión normalmente permitido en mi situación parece ser 993). No sé cuán grande debe ser realmente la pila, pero con la mitad del tamaño especificado a continuación, Python se cuelga.

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

`

Cuestiones relacionadas