正在获取具有延迟执行和延迟加载的Count()

本文关键字:延迟加载 Count 执行 获取 延迟 | 更新日期: 2023-09-27 18:00:33

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

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

或者这会导致在获取计数时使用更多内存吗?在某些情况下,我们会处理非常大的文件,并尽可能将内存使用率降至最低。

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

提前感谢您的帮助。

正在获取具有延迟执行和延迟加载的Count()

这其实并不重要。您的方法和count方法都在内部对GetStreamElementP的结果执行直接循环(此处没有惰性内容)。没有缓存或任何相关内容。

如果你想更快,你必须找到一种智能的方式来缓存/预计算GetStreamElementP的结果,或者在GetStreamElementP上有一个变体,它可以直接对文件进行更智能的计数

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

该函数的内存消耗应该与<p>元素的大小成比例。因此,如果有很多小元素,就不应该消耗大量内存。如果你有相对较少的巨大元素,这可能会消耗相当多的内存,因为你要从每个元素中创建一个XElement。如果是这样的话,那么完全不创建它们就可以大大减少内存消耗。