Я уже несколько часов пытаюсь найти ответ на этот вопрос в Интернете и на этом сайте, и я не совсем там.
Я понимаю, что .NET выделяет приложениям 1 МБ, и что лучше избегать переполнения стека путем перекодирования, а не форсировать размер стека.
Я работаю над приложением "кратчайший путь", которое прекрасно работает примерно до 3000 узлов, после чего оно переполняется. Вот метод, который вызывает проблемы:
public void findShortestPath(int current, int end, int currentCost)
{
if (!weight.ContainsKey(current))
{
weight.Add(current, currentCost);
}
Node currentNode = graph[current];
var sortedEdges = (from entry in currentNode.edges orderby entry.Value ascending select entry);
foreach (KeyValuePair<int, int> nextNode in sortedEdges)
{
if (!visited.ContainsKey(nextNode.Key) || !visited[nextNode.Key])
{
int nextNodeCost = currentCost + nextNode.Value;
if (!weight.ContainsKey(nextNode.Key))
{
weight.Add(nextNode.Key, nextNodeCost);
}
else if (weight[nextNode.Key] > nextNodeCost)
{
weight[nextNode.Key] = nextNodeCost;
}
}
}
visited.Add(current, true);
foreach (KeyValuePair<int, int> nextNode in sortedEdges)
{
if(!visited.ContainsKey(nextNode.Key) || !visited[nextNode.Key]){
findShortestPath(nextNode.Key, end, weight[nextNode.Key]);
}
}
}//findShortestPath
Для справки, класс Node имеет одного члена:
public Dictionary<int, int> edges = new Dictionary<int, int>();
График []:
private Dictionary<int, Node> graph = new Dictonary<int, Node>();
Я попытался оптимизировать код, чтобы он не переносил больше багажа, чем нужно, от одной итерации (рекурсии?) К следующей, но с графом 100K-узла, где каждый узел имеет от 1 до 9 ребер он достигнет лимита в 1 МБ довольно быстро.
Во всяком случае, я новичок в C # и оптимизации кода, если кто-нибудь может дать мне несколько указателей ( не так ), я был бы признателен.