c# - linq 查询中的垃圾回收

标签 c# linq garbage-collection deferred-execution

我有一个关于如何在 linq 查询中处理垃圾收集的问题。 假设我得到了一份要处理的请求列表。每个请求都会生成一组非常大的数据,但随后会应用过滤器以仅保留来自每个请求负载的关键数据。

//Input data
List<request> requests;
IEnumerable<filteredData> results = requests.Select(request => Process(request)).Select(data => Filter(data));

所以我知道每个数据项的查询都会延迟,直到请求每个过滤的数据项为止,这很好。但是,在可枚举完成之前,中间的内存密集部分是否会持续存在?

我希望发生的是每个数据元素在通过过滤阶段后立即被垃圾收集,从而确保我有足够的内存来处理整个列表。是这种情况,还是中间的可枚举对象会保留所有内容,直到整个查询结束?如果是这样,是否有 linq 方法来处理这个问题?


注意:Process() 函数生成内存密集型数据……这就是我担心的地方

最佳答案

只要 Process(...)Filter(...) 的返回值不包含对所用“大数据项”的任何引用在内部,那么在处理每个元素后,该进程中使用的内存应该变得无根并且成为 GC 的候选对象。

这并不意味着它会被收集,只是它会成为一个候选者。如果内存压力变高,GC 很可能会收集它。

关于c# - linq 查询中的垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3160688/

相关文章:

c# - 将大量数据复制到 SQL CE 数据库中

c# - Linq like for Java

c# - DistinctBy 在 C#/Visual Studio 2012 中不起作用

c# - 字符串比较 == 是否仅因为字符串不可变才起作用?

C# 内联检查语句不起作用

c# - 从字符串列表中获取唯一项

c# - 为什么 WeakReference.IsAlive 变为假?

c# - Distinct() 方法是否保持序列的原始顺序不变?

java - java中的复制收集器如何设法跳过访问死对象?

C#:如果需要内存,GC 会收集,还是会给出内存不足异常?