递归目录遍历/树消耗大量内存

问题描述

|| 我已经在C#中编写了一个递归目录遍历方法(从asp.net页托管)。该代码按我的预期工作(我枚举了目标计算机上的共享列表,然后递归遍历这些共享并将每个文件/目录添加到TreeView中)。不幸的是,这会占用大量内存,并且需要很长时间才能运行,打开aspx页面会导致Webdev.Webserver内存使用率飙升至800兆字节,而查看该页面的Chrome实例会消耗高达1.5GB的RAM! (针对本地工作站上托管的SMB共享运行测试代码)如果没有chrome挂起,我什至无法查看页面代码
foreach (TreeNode n in FileSelectList.Nodes)
{
    Dir_Node_Recurse(n,hostName);
    //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对象,这似乎导致了资源的极端消耗。我应该创建自己的节点类型以最大程度地减少内存使用,还是有另一种技术可以使这种方法可用?     

解决方法

您是否需要获取所有节点的原因?您可以使用按需方法吗? 您还可以分析代码。您可以尝试将代码指向较小的目录,并观察其行为。     ,你想让我做什么? 您正在创建一个巨大的页面,并询问如何使其消耗更少的内存?这很明显–不要显示页面中的所有树,无论如何它永远不会对任何用户有用。 例如,您可以将输出限制为仅几个级别。