2012-08-16 33 views
6

बाद में मैंने डॉटनेट 4.5 में अपग्रेड करने के बाद, एक क्वेरी ने मुझे आउटऑफमेमरी एक्सेप्शन देने शुरू कर दिया।PLINQ Take() का उपयोग करते समय OutOfMemoryException क्यों फेंक दिया जाएगा?

(आसुत) क्वेरी है:

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

मैं एक ही समस्या के साथ किसी के लिए भी इस पोस्टिंग कर रहा हूँ। मैं नीचे जवाब दूंगा।

+2

क्या आप 32 बिट या 64 बिट में चल रहे हैं? – Oded

+0

32 बिट प्रक्रिया। –

+0

मैं इस तरह के कोड को उस फ़ंक्शन के अंदर उपयोग कर रहा था जिसने तत्वों की संख्या को वापस करने के लिए पैरामीटर प्राप्त किया था। Int.MaxValue पास करना (वहां एक अधिभार था जो कि बस किया गया था) अनिवार्य रूप से 'सबकुछ लेना' था। –

उत्तर

7

यह ढांचे में बदलाव प्रतीत होता है।

टेक() ऑपरेटर TakeOrSkipQueryOperator आंतरिक कक्षा में कार्यान्वित किया गया है। कोड में एक शाखा है जो एक WrapHelper() फ़ंक्शन के माध्यम से जाती है जो एक फिक्स्ड मैपहेप उदाहरण बनाता है जो बदले में मूल रूप से ले जाने वाले आकार के मुख्य तत्वों की एक सरणी बनाता है() (जो दिए गए उदाहरण में 8 जीबी की सरणी होगी)।

+0

ठीक है। लेकिन इसे कैसे ठीक करें? – Steven

+1

@Steven एक 'टेक' मान सेट करें जिसके लिए आपके पास कई परिणामों को संग्रहीत करने के लिए पर्याप्त स्मृति है। (या अधिक मेमोरी प्राप्त करें।) – Servy

+3

अधिक उचित अनुकूलन की तरह लगता है - कई मामलों में बेहतर समांतरता की अनुमति देनी चाहिए क्योंकि विभिन्न धागे एक दूसरे के साथ हस्तक्षेप के जोखिम के बिना उस ढेर के विभिन्न हिस्सों को लिख सकते हैं। हालांकि इस मामले में नीचे की तरफ स्पष्ट है। –