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

本文关键字:内存 遍历 递归 | 更新日期: 2023-09-27 17:57:06

我用C#编写了一个递归目录遍历方法(从 asp.net 页面托管)。 代码按我的预期工作(我枚举目标计算机上的共享列表,然后递归浏览共享并将每个文件/目录添加到 TreeView)。 不幸的是,这会消耗大量内存并且需要很长时间才能运行,打开 aspx 页面会导致 Webdev.Webserver RAM 使用率飙升至 800 兆字节,而查看该页面的 Chrome 实例消耗高达 1.5GB 的 RAM!(针对本地工作站上托管的 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 对象。 我应该创建自己的节点类型以最大程度地减少内存使用量,还是有其他技术可以使其可用?

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

是否有

理由需要获取所有节点?您可以使用按需方法吗?

您还可以分析代码。您可以尝试将代码指向较小的目录并观察其行为。

你想做什么?

您正在创建一个大页面并询问如何使其消耗更少的内存?这很明显 - 不要在页面中显示所有树,无论如何它都不会对任何用户有用。

例如,您可以将输出限制为仅几个级别。