का उपयोग नहीं कर रहा प्रतीत होता है मैं एफ # में कुछ कम्प्यूटेशनल गहन काम कर रहा हूं। Array.Parallel.map
जैसे फ़ंक्शंस जो नेट टास्क समांतर लाइब्रेरी का उपयोग करते हैं, वास्तव में काफी कम प्रयास के लिए मेरे कोड को तेजी से बढ़ा दिया है।एफ # PSeq.iter सभी कोर
हालांकि, स्मृति चिंताओं के कारण, मैंने अपने कोड का एक खंड रीमेड किया ताकि इसे अनुक्रम अभिव्यक्ति के अंदर आलसी मूल्यांकन किया जा सके (इसका मतलब है कि मुझे कम जानकारी को स्टोर करना और पास करना है)। जब यह मूल्यांकन करने के लिए समय आ गया मैं प्रयोग किया है:
// processor and memory intensive task, results are not stored
let calculations : seq<Calculation> = seq { ...yield one thing at a time... }
// extract results from calculations for summary data
PSeq.iter someFuncToExtractResults results
बजाय:
// processor and memory intensive task, storing these results is an unnecessary task
let calculations : Calculation[] = ...do all the things...
// extract results from calculations for summary data
Array.Parallel.map someFuncToExtractResults calculations
Array.Parallel कार्यों में से किसी का उपयोग करते समय मैं स्पष्ट रूप से गियर में अपने कंप्यूटर लात पर सभी कोर देख सकते हैं (~ 100% सीपीयू उपयोग)। हालांकि अतिरिक्त स्मृति की आवश्यकता है कि कार्यक्रम कभी खत्म नहीं हुआ।
जब मैं प्रोग्राम चलाता हूं तो PSeq.iter संस्करण के साथ, केवल 8% CPU उपयोग (और न्यूनतम RAM उपयोग) होता है।
तो: क्या कोई कारण है कि पीएसईक संस्करण इतनी धीमी गति से चलता है? क्या यह आलसी मूल्यांकन की वजह से है? क्या कुछ जादू "समानांतर" सामान है जो मुझे याद आ रही है?
धन्यवाद,
अन्य संसाधन, दोनों के स्रोत कोड कार्यान्वयन (वे .NET में अलग समानांतर पुस्तकालयों का उपयोग करने लगते हैं):
https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/array.fs
https://github.com/fsharp/powerpack/blob/master/src/FSharp.PowerPack.Parallel.Seq/pseq.fs
संपादित करें: अधिक जोड़ा गया कोड उदाहरण और विवरण के लिए विवरण
कोड:
Seq
// processor and memory intensive task, results are not stored let calculations : seq<Calculation> = seq { for index in 0..data.length-1 do yield calculationFunc data.[index] } // extract results from calculations for summary data (different module) PSeq.iter someFuncToExtractResults results
सरणी
// processor and memory intensive task, storing these results is an unnecessary task let calculations : Calculation[] = Array.Parallel.map calculationFunc data // extract results from calculations for summary data (different module) Array.Parallel.map someFuncToExtractResults calculations
विवरण:
- Intermediat भंडारण ई सरणी संस्करण 10 मिनट से कम समय में (जहां तक यह क्रैश से पहले हो जाता है) चलाता है लेकिन क्रैश होने से पहले ~ 70 जीबी रैम का उपयोग करता है (64 जीबी भौतिक, बाकी पेजेड)
- सीईसी संस्करण 34 मिनट से अधिक लेता है और रैम के एक अंश का उपयोग करता है (केवल 30 जीबी)
- एक ~ अरब मूल्य है जो मैं गणना कर रहा हूं। इसलिए एक बिलियन युगल (प्रत्येक 64 बिट्स पर) = 7.4505806 जीबी। डेटा के अधिक जटिल रूप हैं ... और कुछ अनावश्यक प्रतियां जिन्हें मैं साफ कर रहा हूं इसलिए मौजूदा भारी रैम उपयोग।
- हाँ वास्तुकला महान नहीं, आलसी मूल्यांकन मुझे के पहले भाग में छोटे टुकड़ों में प्रोग्राम और/या डेटा को बैच का अनुकूलन करने के एक छोटे डाटासेट के साथ
- , कोड उत्पादन ही दोनों मात्रा का प्रयास कर रहा है परिणाम है।
- @ पैड, मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की, पीएसईक।जब गणना [] को खिलाया जाता है तो यह ठीक से काम करता है (सभी कोर सक्रिय), लेकिन अभी भी रैम का मामला है (यह अंततः दुर्घटनाग्रस्त हो गया है)
- कोड और गणना भाग दोनों का सारांश भाग सीपीयू गहन है (मुख्य रूप से क्योंकि बड़े डेटा सेट का) Seq संस्करण के साथ
- मैं सिर्फ parallelize करने एक बार
आलसी मूल्यांकन समानांतर निष्पादन के साथ अच्छा नहीं खेलता है। निष्पक्ष होने के लिए, 'गणना [] '' PSeq.iter' और' Array.Parallel.map' 'को पास करें। 'गणना' और 'someFuncToExtractResults' के अधिक विवरण किए बिना कारण बताना असंभव है। – pad
सुझाव के लिए धन्यवाद, मैंने कोशिश की और पीएसईक आलसी सीक्यू के बजाय सरणी दिए जाने पर अच्छी तरह से व्यवहार करता है ... हालांकि यह रैम समस्या –