开发者

Recursive directory traversal/tree consumes extreme amounts of memory

I have written a recursive directory traversal method in C# (hosted from an asp.net page). The code works as I intended (I enumerate a list of shares on a target machine then recurse through the shares and add each file/directory to a TreeView). Unfortunately this consumes an extreme amount of memory and takes a very long time to run, opening the aspx page causes the Webdev.Webserver ram usage to spike to 800 megabytes, and the Chrome instance viewing the page consumes a whopping 1.5GB of RAM! (running the test code against SMB shares hosted on my local workstation) I can't even view the page source without chrome hanging.

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

Uncommenting out the //break; statement results in only the first directory share being processed, and this consumes far less memory. FileSelectList is an 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()));
        }
}

This appears to cause extreme resource usage because of the large number of TreeNode objects being created. Should I create my own node type to perhaps minimize memory usage, or is there another technique that would make this usable?


Is there a reason you need to get all the nodes? Can you use an on demand approach?

You can also profile the code. You can try pointing the code to a smaller directory and observe it's behavior.


What do you want to do?

You are creating a huge page and asking how to make it consume less memory? That's obvious – don't show all the tree in the page, it's never going to be useful to any user anyway.

You can limit the output to only several levels, for example.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜