LINQ 和内存分配
Posted
技术标签:
【中文标题】LINQ 和内存分配【英文标题】:LINQ and memory allocation 【发布时间】:2018-07-12 12:51:16 【问题描述】:在 LINQ 一词下的这个问题中,我的意思是 LINQ to objects。
哪些 LINQ 方法分配新内存,哪些不分配?
例如,Select(x => x) 是否分配新内存?
如果 LINQ 中有不同的方法 - 有些分配内存而另一些没有 - 我是否从内存效率的角度检查并考虑了 LINQ 链中的每个方法?那么使用 LINQ 不仅仅是简单愚蠢地在 LINQ 链中添加任何方法?因此,在链中使用它之前,我需要不断记住每个 LINQ 方法“功能”吗?换句话说,在内存效率方面,是否没有使用 LINQ 的单一规则或模式(如“LINQ 总是分配/不分配新内存”)?
【问题讨论】:
你可以通过这个链接有一些想法:***.com/questions/4304961/linq-memory-question 你需要了解每个函数在做什么。为此,值得看看 Jon skeets 关于实现 linq 的博客...... 另外,Linq 并不直接,因为它可以针对不同的事物,在这种情况下,您实际上是在谈论 linq to objects @KeithNicholas 是的,你是对的。我指定了我的问题。 【参考方案1】:MSDN for Enumerable.Select 指定它“这个方法是通过使用延迟执行来实现的。立即返回值是一个对象,它存储了执行该操作所需的所有信息。”因此,它至少为 lambda (x=>x
) 和调用它的集合分配内存。但是,这会按照查询复杂度的顺序占用内存,而而不是按照集合大小的顺序占用,因此几乎可以忽略不计。
内存只在查询结果迭代时按照集合大小的顺序分配。正如 Pareek 的链接所示,这通常在每个查询中发生一次。在LINQ and Deferred Execution(即使它与 LINQ to SQL 相关)中,对此给出了一个很好的声明:如果 LINQ 方法返回的内容与 IEnumerable 不同,则它必须迭代集合并因此可能分配新内存(例如 ToList()、ToArray ()) 但不是必须的(例如 Count())。
因此,如果您最终得到某种非 IEnumerable 的集合,则查询将按照 此结果集合的大小顺序分配内存。
【讨论】:
所以,据我了解,Select(x=>x) 不会分配新的集合(正是我之前提到的这种分配类型,不是迭代的附属信息),而是 Select(x=> x).ToList() 呢?另一个例子: Select(x=>new SomeType(x)) 也不分配新的集合,但是 Select(x=>new SomeType(x)).ToList() 呢?以上是关于LINQ 和内存分配的主要内容,如果未能解决你的问题,请参考以下文章