Подумайте об этом как о генеалогическом древе, у отца есть дети, у этих детей есть дети, у этих детей есть дети и т.д... Таким образом, у меня есть рекурсивная функция, в которой отец использует Recursion для получения дочерних элементов, а теперь просто распечатывает их для вывода окна вывода... Но в какой-то момент (через один час после запуска и печати, например, 26000 строк) это дает мне исключение StackOverFlowException.
Итак, у меня действительно нехватает памяти? хммм? то не следует ли мне получать исключение "Out of memory"? на других сообщениях, которые я обнаружил, когда люди говорили, что количество рекурсивных вызовов слишком велико, вы все равно можете получить исключение SOF...
Во всяком случае, моя первая мысль заключалась в том, чтобы разбить дерево на более мелкие подграфы. Я знаю, что мой корневой отец всегда имеет этих пяти детей, поэтому вместо того, чтобы вызывать мой метод один раз с переданным ему корнем, Я сказал, что хорошо назовите его пять раз с Kids of root. Проходит к нему. Это помогло мне подумать... но все-таки один из них настолько велик - 26000 строк, когда он падает, и все еще есть эта проблема.
Как насчет областей приложений и создания новых процессов во время выполнения на определенном уровне глубины? Помогает ли это?
Как создать собственный стек и использовать его вместо рекурсивных методов? это помогает?
здесь также высокий уровень моего кода, пожалуйста, взгляните, возможно, на самом деле есть что-то глупое с этим, что вызывает ошибку SOF:
private void MyLoadMethod(string conceptCKI)
{
// make some script calls to DB, so that moTargetConceptList2 will have Concept-Relations for the current node.
// when this is zero, it means its a leaf.
int numberofKids = moTargetConceptList2.ConceptReltns.Count();
if (numberofKids == 0)
return;
for (int i = 1; i <= numberofKids; i++)
{
oUCMRConceptReltn = moTargetConceptList2.ConceptReltns.get_ItemByIndex(i, false);
//Get the concept linked to the relation concept
if (oUCMRConceptReltn.SourceCKI == sConceptCKI)
{
oConcept = moTargetConceptList2.ItemByKeyConceptCKI(oUCMRConceptReltn.TargetCKI, false);
}
else
{
oConcept = moTargetConceptList2.ItemByKeyConceptCKI(oUCMRConceptReltn.SourceCKI, false);
}
//builder.AppendLine("\t" + oConcept.PrimaryCTerm.SourceString);
Debug.WriteLine(oConcept.PrimaryCTerm.SourceString);
MyLoadMethod(oConcept.ConceptCKI);
}
}