में समानांतर डेटा संग्रह सूची, सरणी या seq में से कौन सा समानांतर प्रसंस्करण के लिए अधिक कुशल हैं और आसानी से इस तरह के parmap
, parfilter
, आदि के रूप में समानांतर आपरेशन लागू कर सकते हैं?एफ #
संपादित करें: सुझावों के लिए धन्यवाद। Array.Parallel
एक अच्छा विकल्प की तरह दिखता है। PSeq.fs
को भी चेक आउट किया गया है और मुझे इस सवाल के बारे में एक प्रश्न है कि pmap
काम के नीचे कैसे है।
let pmap f xs =
seq { for x in xs -> async { return f xs } }
|> Async.Parallel
|> Async.RunSynchronously
अनुक्रम में प्रत्येक तत्व के लिए एक नया धागा उत्पन्न होता है? यदि हां, तो क्या सीक को टुकड़ों में तोड़ने और समानांतर में मूल्यांकन करने के लिए प्रत्येक खंड के लिए एक नया कार्य बनाने का कोई तरीका है?
मैं यह भी देखना चाहूंगा कि सूची के लिए कोई समान pmap
कार्यान्वयन है या नहीं। मैंने पाया कि टॉमस के पास कार्यान्वयन उनके ब्लॉग पोस्ट here में है। लेकिन मुझे यकीन नहीं है कि समांतर मूल्यांकन करने के लिए सूची में सरणी को परिवर्तित करने से बहुत अधिक ओवरहेड नहीं होता है और यदि इससे बचा जा सकता है?
संपादित करें: अपने सभी आदानों के लिए धन्यवाद। टॉमस ने मेरे मूल प्रश्न का उत्तर दिया।
पहले संपादन में मेरे अपने प्रश्न का उत्तर देना:
मैं तोड़ने टुकड़ों में एक बड़ी सूची तो प्रत्येक sublist को async लागू करने की कोशिश की।
let pmapchunk f xs =
let chunks = chunk chunksize xs
seq { for chunk in chunks -> async { return (Seq.map f) chunk } }
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.concat
परिणाम: map
: 15s, pmap
: 7s, pmapchunk
: 10s।
यह निर्भर करता है, लेकिन आप लगभग निश्चित रूप से 'चाहते Array.Parallel' और नहीं' async'। –