ツリーをトラバースするために再帰アルゴリズムを実行している場合...大量のデータがあり、巨大であることがわかっている場合..20分後に「スタックオーバーフロー」例外が発生します。しかし、StackOverFlow はコード内の他のエラーが原因である可能性があり、おそらく無限ループが原因である可能性があります...したがって、VisualStudio で発生するこの SOF エラーが、再帰アルゴリズムが RAM を使い果たしているためであり、それが原因ではないことを確認しようとしています。他のエラーの...再帰アルゴリズムでメモリが不足している場合、特別なタイプのエラー メッセージまたは例外がありますか?
6 に答える
メモリが不足すると、OutOfMemory 例外が発生します。
System.OutOfMemoryException
http://msdn.microsoft.com/en-us/library/system.outofmemoryexcetion.aspx
また、@SLaks が示したStackoverflowException
ように、メモリ不足が原因で発生することはありません。
System.OutOfMemoryExceptionは、メモリが少ない場合にスローされる可能性があります。System.StackOverflowExceptionは、再帰的に超複雑なものを使用して、または終了ケースを使用せずにコール スタックを破棄したことです。
「RAM 不足」の報告に最も近いのはOutOfMemoryExceptionですが、それは次の操作に十分な連続 RAM を割り当てることができない場合のみです。ホストのRAMが不足しているという意味ではありません。
StackOverflowException にはこれが内部例外として含まれている可能性がありますが、わかりません。
ツリーが深い場合は、再帰を使用する代わりに独自のスタックを管理してみませんか? 何かのようなもの:
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.
}
少し再帰的な実験を自分で実行したところ、スタック スペースが不足するまでに約 87000 回の反復が行われました。メソッド呼び出しでは、ヒープではなく常にスタックが使用されます。ヒープベースのスタックを作成する方法があれば、もう少しうまくいくかもしれません。その点については、次の記事をお読みください (ただし、C# には当てはまらない場合があります)。
また、これをチェックしてください...
編集。あなたの質問に答えて...
一般に、アプリケーションがスタック領域を超えようとすると、StackOverflowException が発生します。アプリケーションがヒープ領域を超えようとすると、OutOfMemoryException が発生します。