2012-08-16 15 views
6

DotNet 4.5にアップグレードした後、クエリがOutOfMemoryExceptionsを与え始めました。PLINQ Take()の使用中にOutOfMemoryExceptionがスローされるのはなぜですか?

(蒸留)クエリは次のとおりです。私は同じ問題を持つ人のためにこれを掲示しています

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

。私は以下で答えます。

+2

32ビットまたは64ビットで動作していますか? – Oded

+0

32ビットプロセス。 –

+0

私はこの種のコードを、返される要素数でパラメータを受け取った関数の中で使用していました。 int.MaxValueを渡す(それを行った過負荷があった)本質的に「すべてを取る」ことを意味していました。 –

答えて

7

フレームワークの変更のようです。

Take()演算子は、TakeOrSkipQueryOperator内部クラスで実装されています。コード内には、FixedMapHeapインスタンスを作成するWrapHelper()関数を実行する分岐が1つあります。この関数はもともとTake()に渡されたサイズのKey要素の配列を作成します(この例では8Gbの配列になります) )。

+0

しかし、それを修正する方法は? – Steven

+1

@Steven多くの結果を格納するのに十分なメモリがある 'Take'値を設定します。 (またはメモリを増やす) – Servy

+3

多くの場合、多くの場合、合理的な最適化のように聞こえます。異なるスレッドが互いに干渉することなくそのヒープの異なる部分に書き込むことができるため、多くの場合、より良い並列化が可能になります。この場合のダウンサイドは明らかです。 –

関連する問題