【问题标题】:Recursive directory traversal/tree consumes extreme amounts of memory递归目录遍历/树消耗大量内存
【发布时间】:2011-08-29 06:03:05
【问题描述】:

我用 C# 编写了一个递归目录遍历方法(托管自 asp.net 页面)。代码按我的预期工作(我枚举目标机器上的共享列表,然后通过共享递归并将每个文件/目录添加到 TreeView)。不幸的是,这会消耗大量内存并且需要很长时间才能运行,打开 aspx 页面会导致 Webdev.Webserver 内存使用量飙升至 800 兆字节,并且查看该页面的 Chrome 实例消耗了高达 1.5GB 的内存! (针对托管在我的本地工作站上的 SMB 共享运行测试代码)我什至无法在没有 chrome 挂起的情况下查看页面源代码。

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 对象,这似乎会导致极端的资源使用。我应该创建自己的节点类型以尽量减少内存使用,还是有另一种技术可以使它可用?

【问题讨论】:

  • 任何你必须预先枚举所有文件夹而不是等待用户输入的原因 - 如果用户可以选择是否钻入特定文件夹,这不是一个好时机看看@文件夹的内容?

标签: c# asp.net recursion tree-traversal


【解决方案1】:

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

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

【讨论】:

  • 好吧,我打算创建方法来处理所有选定的文件,这棵树上有一个复选框。此外,我希望能够存储选择了哪些文件的列表(在 sql 中),并在加载页面时根据存储的数据填写复选框。我会试试你的点击方法,看看我是否可以提高加载效率。
【解决方案2】:

你想做什么?

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

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

【讨论】:

  • 这个应用程序的上下文是一个 SMB 备份实用程序 a-la veritas,仅通过 HTTP 运行,并以 Windows 服务作为后端。我希望枚举的文件和目录可选择作为备份目标。我可以在用户遍历目录时动态地执行此操作,但它仍然让我感到紧张,如果用户扩展了足够多的目录树,它仍然会使网络浏览器在内存方面失控。
猜你喜欢
  • 2011-05-12
  • 2018-07-12
  • 2014-03-11
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2021-11-09
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多