2010-01-14 10 views
5

Ho un programma python che utilizza una DLL personalizzata. Questa DLL si arresta in modo anomalo a causa di un sovraccarico dello stack. Questo overflow non è dovuto a una funzione ricorsiva andata male, ma a grandi allocazioni nello stack usando alloca().Come aumentare le dimensioni dello stack in python

Desidero aumentare le dimensioni dello stack per eliminare questo errore. C'è un modo per fare questo?

+0

Se è possibile modificare il codice sorgente, vedere http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

risposta

2

AFAIK un programma può solo modificare la dimensione dello stack di nuovi thread o processi (ad esempio la funzione di Windows CreateThread). Poichè Python (e l'API Win32 per Python) non espone tale funzionalità, è preferibile sostituire l'allocazione dello stack con la memoria heap. O c'è una ragione specifica per usare lo stack ?? Se in realtà è necessario utilizzare alloca, è possibile che si desideri creare un thread separato per l'esecuzione del codice DLL (che, a mio avviso, è eccessivo).

EDIT: Correzione - Python non permette di impostare la dimensione dello stack durante la creazione di nuove discussioni (vedi thread.stack_size)

+0

Il motore ODE (DLL che causa il problema) usa alloca per velocizzare i grandi calcoli matriciali. Fortunatamente, ha un flag di compilazione che mi consente invece di passare a malloc. È un po 'più lento, ma funziona. Grazie! –

2

Le funzioni in una DLL non possono avere controllo sulle dimensioni dello stack disponibili quando vengono eseguite (a meno che non si generino nuovi thread sotto il controllo della libreria).

Se la dll è personalizzata, non è possibile allocare nell'heap anziché impilare (o allocare staticamente, se necessario) e arrestare il problema in questo modo?

6

Il pitone thread module permette di specificare un nuovo stack size per nuove discussioni. Prova a impostarlo su un valore che ritieni sufficientemente grande e quindi esegui il lavoro di questa DLL in una nuova discussione.

2

Come indicato in alcune domande correlate like here, in genere non è una buona idea giocare con le dimensioni dello stack per estendere la profondità di ricorsione, ma ecco il codice che mostra come far crescere lo stack con quell'effetto. Con python 3.5, su un sistema Windows 10 x64, dimostra una ricorsione molto profonda che è normalmente impossibile (il limite di ricorsione normalmente consentito nella mia situazione sembra essere 993). Non so quanto sia grande lo stack in realtà, ma con metà delle dimensioni specificate di seguito, Python si blocca.

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

`

Problemi correlati