【发布时间】:2017-09-11 12:09:25
【问题描述】:
我正在使用 Linq 的 except 语句耗尽内存。
例子:
var numbers = Enumerable.Range(1, 10000000);
int i=0;
while (numbers.Any())
{
numbers = numbers.Except(new List<int> {i++});
}
我反编译了这个方法,这也是一样的,但也会出现内存不足的异常。
var numbers = Enumerable.Range(1, 10000000);
int i=0;
while (numbers.Any())
{
numbers = CustomExcept(numbers, new List<int>{i++});
}
private IEnumerable<int> CustomExcept(IEnumerable<int> numbers, IEnumerable<int> exceptionList)
{
HashSet<int> set = new HashSet<int>();
foreach (var i in exceptionList)
{
set.Add(i);
}
foreach (var i in numbers)
{
if (set.Add(i))
{
yield return i;
}
}
}
所以我的问题是:为什么这会引发内存不足异常?
我希望垃圾收集器清理未使用的 HashSet。
【问题讨论】:
-
您应该了解延迟执行的影响(通过
yield实现)。每一步都执行前面的所有步骤,从Range和所有Excepts 开始。并做了两次(因为Any调用)。 -
更新了示例
标签: c# linq out-of-memory yield-return