我有一个关于如何在 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/