我在C#中编写了一个递归目录遍历方法(从asp.net页面托管)。代码按照我的意图工作(我枚举目标机器上的共享列表,然后通过共享进行递归并将每个文件/目录添加到TreeView)。不幸的是,这会占用大量内存并且需要很长时间才能运行,打开aspx页面会导致Webdev.Webserver ram使用率达到800兆字节,查看页面的Chrome实例会消耗高达1.5GB的内存! (针对托管在我本地工作站上的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对象,这似乎会导致极端资源使用。我应该创建自己的节点类型,以尽可能减少内存使用量,还是有另一种技术可以使其可用?
答案 0 :(得分:0)
您是否有理由获得所有节点?你能用点播方法吗?
您还可以分析代码。您可以尝试将代码指向较小的目录并观察其行为。
答案 1 :(得分:0)
你想做什么?
您正在创建一个巨大的页面并询问如何使其消耗更少的内存?这很明显 - 不要在页面中显示所有树,它对任何用户都不会有用。
例如,您可以将输出限制为几个级别。