正在获取具有延迟执行和延迟加载的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方法都在内部对GetStreamElementP的结果执行直接循环(此处没有惰性内容)。没有缓存或任何相关内容。
如果你想更快,你必须找到一种智能的方式来缓存/预计算GetStreamElementP的结果,或者在GetStreamElementP上有一个变体,它可以直接对文件进行更智能的计数
在您的情况下,两种计算计数的方法都是一样的。
该函数的内存消耗应该与<p>
元素的大小成比例。因此,如果有很多小元素,就不应该消耗大量内存。如果你有相对较少的巨大元素,这可能会消耗相当多的内存,因为你要从每个元素中创建一个XElement
。如果是这样的话,那么完全不创建它们就可以大大减少内存消耗。