【问题标题】:Getting Count() with deferred execution and lazy loading使用延迟执行和延迟加载获取 Count()
【发布时间】:2011-06-29 06:33:24
【问题描述】:

我有一些使用延迟执行和延迟加载的代码:

    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>();
    }

或者这会导致在获取计数时使用更多内存吗?在某些情况下,我们正在处理非常大的文件,并尝试尽可能减少内存使用量。

我试图找到一个具体的例子来解释在每种情况下如何使用内存,但没有成功。

提前感谢您的帮助。

【问题讨论】:

    标签: c# linq lazy-loading deferred-execution


    【解决方案1】:

    其实没关系。您的方法和 count 方法都在内部对 GetStreamElementP 的结果执行直接循环(这里没有懒惰的东西)。没有缓存或任何涉及。

    如果您希望这更快,您要么必须找到一种智能的方式来缓存/预先计算 GetStreamElementP- 的结果,要么在 GetStreamElementP 上有一个变体,它可以更智能地直接对文件进行计数

    【讨论】:

      【解决方案2】:

      在您的情况下,两种计算计数的方法都是一样的。

      此函数的内存消耗应与&lt;p&gt; 元素的大小成正比。所以,如果有很多小元素,它不应该消耗大量的内存。如果您有相对较少的大元素,这可能会消耗大量内存,因为您要从每个元素中创建一个XElement。如果是这种情况,则根本不创建它们可以使内存消耗变得更小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 2018-06-24
        • 2016-12-14
        • 2019-02-12
        • 2011-02-16
        相关资源
        最近更新 更多