为什么在使用PLINQ Take()时会抛出OutOfMemoryException?

时间:2012-08-16 20:48:51

标签: c# out-of-memory .net-4.5 plinq

升级到DotNet 4.5后,一个查询开始给我OutOfMemoryExceptions。

(提炼)查询是:

var tests = new int[]{}
    .AsParallel()
    .GroupBy(_ => _)
    .Take(int.MaxValue)
    .ToArray();

我发布此问题给任何有相同问题的人。我将在下面回答。

1 个答案:

答案 0 :(得分:7)

这似乎是框架的变化。

Take()运算符在TakeOrSkipQueryOperator内部类中实现。代码中有一个分支通过WrapHelper()函数创建一个FixedMapHeap实例,该实例又创建了一个Key元素数组,该元素的大小最初传递给Take()(在给定的示例中,它将是一个8Gb的数组) )。