2010-03-31 41 views
23

Tengo un programa que realiza llamadas recursivas durante 2 mil millones de veces y el desbordamiento de la pila. Realizo cambios y aún necesito 40,000 llamadas recursivas. Entonces necesito probablemente varios MB de memoria de pila. Escuché que el tamaño de la pila es por defecto de 1MB. Intenté buscar en línea. Alguien dijo que fuera a propiedades -> linker ......... en Visual Studio, pero no puedo encontrarlo.¿Cómo cambiar el tamaño de la pila para un programa .NET?

¿Alguien sabe cómo aumentarlo? También me pregunto si puedo configurarlo en algún lugar de mi programa C#.

P.S. Estoy usando winXP de 32 bits y win7 de 64 bits.

Respuesta

32

La forma más sencilla de configurar el tamaño de pila de .NET 2.0 y Windows XP en adelante es generar un nuevo subproceso con el tamaño de la pila desea: -

using System.Threading; 

Thread T = new Thread(threadDelegate, stackSizeInBytes); 
T.Start(); 

Para cambiar el tamaño de la pila de la programa completo que tendría que utilizar Editbin: -

EDITBIN.EXE /STACK:<stacksize> file.exe 
+2

Para aquellos que utilizan la ruta Editbin, debe descargar el conjunto de herramientas de Visual C++ en el instalador de Visual Studio. También puede ponerlo en sus pasos posteriores a la compilación como 'EDITBIN.EXE/STACK: $ (TargetName)' –

+0

@CameronAavik Agregando a su comentario, necesitaba agregar la carpeta de herramientas SDK a mi ruta, reinicie Visual Studio para ver esto cambie y use '$ (TargetPath)' en lugar de '$ (TargetName)'. –

10

Lo más probable es que intente utilizar bucles en lugar de recursividad.

+7

+1, 2 mil millones de llamadas recursivas es un poco excesivo. –

+0

Seamos un poco más precisos: el problema no es tanto la recursividad * per se *, ni el número de iteraciones (después de todo, todavía habrá 2 mil millones de iteraciones después de la conversión a un ciclo). El verdadero problema es que el compilador podría no generar llamadas finales; solo por eso la recurrencia combinada con el alto número de iteraciones se vuelve problemática. – stakx

16

No hay opción de compilación para hacerlo. Puede edit it after the fact using editbin /stack, o crear un hilo separado para su algoritmo, y especificar un tamaño de pila más grande en el Thread constructor.

Dicho esto, es posible que desee aplanar su función recursiva ... Si tiene desbordamientos de pila ahora, es difícil saber que cualquier tamaño de pila será apropiado a largo plazo. Esta es solo una solución de curita.

0

sé que en VS puede establecer un tamaño de pila arbitraria (EDIT: para los programas de C++). Sin embargo, le sugiero que use una llamada de cola (es decir, devuelva MyFunc (args);) que recicla automáticamente el espacio de la pila. Luego, usaría algún objeto asignado en el montón para mantener el estado.

+0

En general, no creo que los compiladores .NET optimicen una llamada recursiva de cola. Al menos, C# y VB.NET no. – user1172763

Cuestiones relacionadas