2011-06-28 32 views
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>(); 
    } 

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

私は、どのようにメモリが成功しなくともどのように使用されるかを説明する具体的な例を見つけることを試みました。

ご協力いただきありがとうございます。

答えて

0

に賢く、カウントを行いGetStreamElementPのバリアントを持っていますあなたのケースでは、カウントを計算する両方の方法が同じようになります。

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

2

本当に問題ありません。 GetStreamElementPの結果に対して、メソッドとカウントメソッドの両方が内部的に直接ループを実行します(ここでは怠惰なものはありません)。キャッシングなどは何もありません。あなたはこれが速くなりたい場合は

、あなたはのスマートな方法を見つけなければならないのいずれかのキャッシング/ GetStreamElementP-の結果を事前に計算するか、ファイルを直接

関連する問題