我有一个关于如何在linq查询中处理垃圾回收的问题。 假设我有一个要处理的请求列表。每个请求都会生成一个非常大的一组数据,但是之后会应用一个过滤器来仅保留来自每个请求负载的关键数据。linq查询中的垃圾回收
//Input data
List<request> requests;
IEnumerable<filteredData> results = requests.Select(request => Process(request)).Select(data => Filter(data));
所以我知道查询延迟每个数据项,直到每个过滤的数据项被请求,所以这很好。但是,这个中间记忆强烈的部分是否会一直持续到可枚举成立?
我希望发生的事情是每个数据元素都可以在通过筛选阶段后立即进行垃圾回收,从而确保我有足够的内存来处理整个列表。这是这种情况,还是中间枚举可以保持一切,直到整个查询结束?如果是这样,是否有解决这个问题的方法?
注:过程()函数生成的内存密集型数据......这就是我很担心
凉爽。我的担心是从第一个select中间可枚举将持有数据,直到它完成 – tbischel 2010-07-01 18:47:18
@tbischel:Nope - LINQ不会持有引用,除了添加到集合的引用之外,等等。只要没有引用,它可以被GCed。 – 2010-07-01 18:50:42