0

遅延実行と遅延読み込みを使用するコードがいくつかあります。

    public static IEnumerable<XElement> GetStreamElementP(string fileId, ListProgressEventHandler progressHandler, int total)
    {
        var filePath = Utility.GetEContentFilePath(fileId);
        using (var reader = XmlReader.Create(filePath, new XmlReaderSettings { IgnoreWhitespace = true, }))
        {
            var cnt = 0;
            reader.MoveToContent();
            // Parse the file and display each of the p nodes.
            reader.Read();
            while (reader.NodeType == XmlNodeType.Element && reader.Name == "p")
            {
                cnt++;
                var returnedValue = XElement.ReadFrom(reader) as XElement;

                int rem = cnt % _streamElementCallBackSize;
                if (progressHandler != null && rem == 0)
                {
                    progressHandler(null, new ListProgressEventArgs { ItemsProcessed = cnt, TotalItemsToProcess = total, });
                }
                yield return returnedValue;
            }
            reader.Close();
        }

    }

要素の数を簡単に数えることを目指しています。現在使用しているコードは次のとおりです。

    public static int FileElementsCount(string fileId)
    {
        var cnt = 0;
        foreach (XElement e in GetStreamElementP(fileId))
        {
            cnt++;
        }
        return cnt;
    }

これを改善できますか?

    public static int FileElementsCount(string fileId)
    {
        return GetStreamElementP(fileId).Count<XElement>();
    }

または、これにより、カウントを取得するときに使用されるメモリが増えますか?場合によっては非常に大きなファイルを処理し、可能な場合はメモリ使用量を最小限に抑えようとしています。

それぞれの場合にメモリがどのように使用されるかを説明する具体的な例を見つけようとしましたが、成功しませんでした。

助けてくれてありがとう。

4

2 に答える 2

2

それは本当に重要ではありません。メソッドとcountメソッドはどちらも、GetStreamElementPの結果に対して内部的に直接ループを実行します(ここでは怠惰なものはありません)。キャッシングなどは一切ありません。

これをより高速にしたい場合は、GetStreamElementP-の結果をキャッシュ/事前計算するスマートな方法を見つけるか、ファイルを直接よりスマートにカウントするGetStreamElementPのバリアントを用意する必要があります。

于 2011-06-28T21:09:59.433 に答える
0

あなたの場合、カウントを計算する両方の方法は同じことをします。

この関数のメモリ消費量は、<p>要素のサイズに比例する必要があります。したがって、小さな要素がたくさんある場合は、大量のメモリを消費するべきではありません。巨大な要素が比較的少ない場合は、それぞれから作成しているため、これはかなりのメモリを消費する可能性がありXElementます。この場合、メモリをまったく作成しないことで、メモリ消費量を大幅に減らすことができます。

于 2011-06-28T22:33:24.883 に答える