2

C# で再帰的なディレクトリ トラバーサル メソッドを作成しました (asp.net ページからホストされています)。コードは意図したとおりに機能します (ターゲット マシン上の共有のリストを列挙し、共有を再帰的に処理して、各ファイル/ディレクトリを TreeView に追加します)。残念ながら、これは大量のメモリを消費し、実行に非常に長い時間がかかります。aspx ページを開くと、Webdev.Webserver の RAM 使用量が 800 メガバイトに急増し、ページを表示する Chrome インスタンスはなんと 1.5 GB の RAM を消費します! (ローカル ワークステーションでホストされている 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 オブジェクトが作成されるため、極端なリソース使用が発生するようです。おそらくメモリ使用量を最小限に抑えるために独自のノード タイプを作成する必要がありますか、それともこれを使用可能にする別の手法はありますか?

4

2 に答える 2

0

何をしたいですか?

巨大なページを作成していて、メモリの消費を抑える方法を尋ねていますか? これは明らかです。ページ内のすべてのツリーを表示しないでください。とにかく、どのユーザーにも役立つことは決してありません。

たとえば、出力をいくつかのレベルだけに制限することができます。

于 2011-05-19T22:32:15.273 に答える
0

すべてのノードを取得する必要がある理由はありますか? オンデマンドのアプローチを使用できますか?

コードをプロファイリングすることもできます。コードをより小さなディレクトリに向けてみて、その動作を観察することができます。

于 2011-05-19T22:11:27.780 に答える