Рекурсивный обход каталога / дерева занимает чрезмерное количество памяти - PullRequest
2 голосов
/ 20 мая 2011

Я написал рекурсивный метод обхода каталога в C # (размещен на странице asp.net). Код работает, как я и предполагал (я перечисляю список общих ресурсов на целевой машине, затем перенаправляю их через общие ресурсы и добавляю каждый файл / каталог в TreeView). К сожалению, это потребляет чрезмерное количество памяти и занимает очень много времени для запуска, открытие страницы aspx приводит к тому, что использование оперативной памяти Webdev.Webserver увеличивается до 800 мегабайт, а экземпляр Chrome, просматривающий страницу, потребляет колоссальные 1,5 ГБ ОЗУ! (запуск тестового кода для общих ресурсов SMB, размещенных на моей локальной рабочей станции) Я даже не могу просмотреть исходный код страницы без зависания хрома.

foreach (TreeNode n in FileSelectList.Nodes)
{
    Dir_Node_Recurse(n, hostName);
    //break;
}

Раскомментирование // break; оператор приводит к тому, что обрабатывается только первый общий каталог, и это занимает гораздо меньше памяти. FileSelectList является Asp: TreeView.

public static void Dir_Node_Recurse(TreeNode node, string hostName)
{
        DirectoryInfo dir = new DirectoryInfo(String.Format(@"\\{0}\{1}",
                                                            hostName,
                                                            node.ValuePath.ToString()
                                                           ));
        TreeNode tNode;
        foreach (var i in dir.EnumerateDirectories())
        {
            tNode = new TreeNode(i.Name.ToString());
            node.ChildNodes.Add(tNode);
            Dir_Node_Recurse(tNode, hostName);
        }

        foreach (var i in dir.EnumerateFiles())
        {
            node.ChildNodes.Add(new TreeNode(i.Name.ToString()));
        }
}

Это вызывает чрезмерное использование ресурсов из-за большого количества создаваемых объектов TreeNode. Должен ли я создать свой собственный тип узла, чтобы, возможно, минимизировать использование памяти, или есть другой метод, который сделает это пригодным для использования?

Ответы [ 2 ]

0 голосов
/ 20 мая 2011

Что вы хотите сделать?

Вы создаете огромную страницу и спрашиваете, как заставить ее использовать меньше памяти? Это очевидно - не показывайте все дерево на странице, оно никогда не будет полезным для любого пользователя.

Вы можете ограничить вывод только несколькими уровнями, например.

0 голосов
/ 20 мая 2011

Есть ли причина, по которой вам нужно получить все узлы? Можете ли вы использовать подход по требованию?

Вы также можете профилировать код. Вы можете попробовать указать код в меньшем каталоге и наблюдать за его поведением.

...