34 Stimmen

Wie ändert man die Stackgröße für ein .NET-Programm?

Ich habe ein Programm, das rekursive Aufrufe für 2 Milliarden Mal und der Stapel überlaufen. Ich mache Änderungen, und dann braucht es immer noch 40K rekursive Aufrufe. Ich brauche also wahrscheinlich mehrere MB Stack-Speicher. Ich habe gehört, dass die Stackgröße standardmäßig 1 MB beträgt. Ich habe versucht, online zu suchen. Jemand sagte, gehen Sie Eigenschaften ->linker .........in Visual Studio, aber ich kann es nicht finden.

Weiß jemand, wie man sie erhöhen kann? Ich frage mich auch, ob ich es irgendwo in meinem C#-Programm einstellen kann?

P.S. Ich verwende 32-bit winXP und 64bit win7.

47voto

Andrew O'Reilly Punkte 1625

Der einfachste Weg, die Stack-Größe ab .NET 2.0 und Win XP einzustellen, besteht darin, einen neuen Thread mit der gewünschten Stack-Größe zu erzeugen:-

using System.Threading;

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

Um die Stackgröße des gesamten Programms zu ändern, müssen Sie editbin:- verwenden.

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

4 Stimmen

Für diejenigen, die die Editbin-Route wählen, müssen Sie das Visual C++-Toolset im Visual Studio-Installationsprogramm herunterladen. Sie können es auch in Ihre Post-Build-Schritte einfügen als EDITBIN.EXE /STACK:<stacksize> $(TargetName)

1 Stimmen

@CameronAavik Um Ihren Kommentar zu ergänzen, musste ich den SDK-Tools-Ordner zu meinem Pfad hinzufügen, Visual Studio neu starten, um diese Änderung zu sehen, und die $(TargetPath) 代わりに $(TargetName) .

0 Stimmen

@JamieThomas Hinzufügen zu Ihrem Kommentar wiederum, anstatt den Pfad zu ändern, können Sie in Post-Build-Ereignis-Befehlszeile einfügen: Aufruf "$(DevEnvDir).. \tools\VsDevCmd.bat "

20voto

Reed Copsey Punkte 536986

Es gibt keine Compileroption, die dies ermöglicht. Sie können nachträglich mit editbin /stack bearbeiten oder erstellen Sie einen separaten Thread für Ihren Algorithmus, und geben Sie eine größere Stapelgröße in der Gewinde-Konstruktor .

Davon abgesehen, möchten Sie vielleicht Ihre rekursive Funktion abflachen... Wenn Sie jetzt Stapelüberläufe haben, ist es schwer zu wissen, dass irgendeine Stapelgröße auf lange Sicht angemessen sein wird. Dies ist nur ein Notbehelf.

9voto

John Boker Punkte 80493

Höchstwahrscheinlich sollten Sie versuchen, Schleifen anstelle von Rekursionen zu verwenden.

0 Stimmen

Lassen Sie uns ein wenig genauer sein: Das Problem ist nicht so sehr die Rekursion per se oder die Anzahl der Iterationen (schließlich wird es nach der Umwandlung in eine Schleife noch 2 Milliarden Iterationen geben). Das eigentliche Problem besteht darin, dass der Compiler möglicherweise keine Tail Calls erzeugt; erst dadurch wird die Rekursion in Verbindung mit der hohen Anzahl von Iterationen problematisch.

-1voto

Puppy Punkte 141483

Ich weiß, dass Sie in VS eine beliebige Stackgröße einstellen können (EDIT: Für C++-Programme). Ich würde jedoch vorschlagen, dass Sie einen Tail-Call verwenden (d.h. return MyFunc(args); ), der automatisch Stackspace recycelt. Dann verwenden Sie ein auf dem Heap allokiertes Objekt, um den Status zu halten.

1 Stimmen

Im Allgemeinen glaube ich nicht, dass die .NET-Compiler einen Tail-Recursive-Aufruf optimieren werden. Zumindest tun C# und VB.NET nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X