0

ツリーをトラバースするために再帰アルゴリズムを実行している場合...大量のデータがあり、巨大であることがわかっている場合..20分後に「スタックオーバーフロー」例外が発生します。しかし、StackOverFlow はコード内の他のエラーが原因である可能性があり、おそらく無限ループが原因である可能性があります...したがって、VisualStudio で発生するこの SOF エラーが、再帰アルゴリズムが RAM を使い果たしているためであり、それが原因ではないことを確認しようとしています。他のエラーの...再帰アルゴリズムでメモリが不足している場合、特別なタイプのエラー メッセージまたは例外がありますか?

4

6 に答える 6

3

メモリが不足すると、OutOfMemory 例外が発生します。

于 2012-08-10T20:13:10.267 に答える
2

System.OutOfMemoryException

http://msdn.microsoft.com/en-us/library/system.outofmemoryexcetion.aspx

また、@SLaks が示したStackoverflowExceptionように、メモリ不足が原因で発生することはありません。

于 2012-08-10T20:13:05.447 に答える
1

System.OutOfMemoryExceptionは、メモリが少ない場合にスローされる可能性があります。System.StackOverflowExceptionは、再帰的に超複雑なものを使用して、または終了ケースを使用せずにコール スタックを破棄したことです。

于 2012-08-10T20:14:05.963 に答える
1

「RAM 不足」の報告に最も近いのはOutOfMemoryExceptionですが、それは次の操作に十分な連続 RAM を割り当てることができない場合のみです。ホストのRAMが不足しているという意味ではありません。

StackOverflowException にはこれが内部例外として含まれている可能性がありますが、わかりません。

于 2012-08-10T20:14:32.090 に答える
1

ツリーが深い場合は、再帰を使用する代わりに独自のスタックを管理してみませんか? 何かのようなもの:

Stack<Node> stack = new Stack<Node>();
stack.Push(rootNode);
Node currentNode;
while( (currentNode = stack.Pop()) != null)
{
    foreach(var childNode in currentNode.Children)
    {
        stack.Push(childNode);
    }
    //process this node.
}
于 2012-08-10T20:24:46.123 に答える
1

少し再帰的な実験を自分で実行したところ、スタック スペースが不足するまでに約 87000 回の反復が行われました。メソッド呼び出しでは、ヒープではなく常にスタックが使用されます。ヒープベースのスタックを作成する方法があれば、もう少しうまくいくかもしれません。その点については、次の記事をお読みください (ただし、C# には当てはまらない場合があります)。

ヒープ領域のみを使用した再帰

また、これをチェックしてください...

http://joel.inpointform.net/software-development/explanation-of-stack-heap-and-recursion-causing-stack-overflow/

編集。あなたの質問に答えて...

一般に、アプリケーションがスタック領域を超えようとすると、StackOverflowException が発生します。アプリケーションがヒープ領域を超えようとすると、OutOfMemoryException が発生します。

于 2012-08-10T21:01:55.047 に答える