Помогает ли мне создание новых процессов для обхода большого дерева?

Давайте думать об этом как о генеалогическом древе,у отца есть дети, у тех детей есть дети, у тех детей есть дети и т.д. Итак, у меня есть рекурсивная функция, которая заставляет отца использовать рекурсию для получения дочерних элементов, а пока просто печатает их для отладки окна вывода... Но в какой-то момент (после одного часа запуска и печати, например, 26000 строк )это дает мне StackOverFlowException.

Так что действительно не хватает памяти? хм? тогда разве я не должен получить «Исключение нехватки памяти»? в других сообщениях я обнаружил, что люди говорят, что если количество рекурсивных вызовов слишком велико, вы все равно можете получить исключение SOF...

Во всяком случае, моей первой мыслью было разбить дерево на более мелкие подулицы -... так что я точно знаю, что у моего корневого отца всегда есть эти пять детей, поэтому вместо того, чтобы вызывать мой метод один раз с переданным ему корнем, я сказал хорошо, вызовите его пять раз с детьми корневых проходов к нему.. Я думаю, это помогло.. но все же один из них такой большой -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);
            }
        }
10
задан user 14 August 2012 в 02:12
поделиться