मैं समानांतर रणनीतियों के आसपास अपने सिर को लपेटने की कोशिश कर रहा हूं। मुझे लगता है कि मैं समझता हूं कि प्रत्येक संयोजक क्या करता है, लेकिन हर बार जब मैं उन्हें 1 से अधिक कोर के साथ उपयोग करने का प्रयास करता हूं, तो कार्यक्रम काफी धीमा हो जाता है।कुशल समानांतर रणनीतियों
उदाहरण के लिए थोड़ी देर पहले मैंने ~ 700 दस्तावेजों से हिस्टोग्राम (और उनके अद्वितीय शब्दों) की गणना करने की कोशिश की। मैंने सोचा कि फ़ाइल स्तर ग्रैन्युलरिटी का उपयोग करना ठीक रहेगा। -N4
के साथ मुझे 1.70 कार्य संतुलन मिलता है। हालांकि -N1
के साथ यह -N4
के साथ आधे समय में चलता है। मुझे यकीन नहीं है कि सवाल वास्तव में क्या है, लेकिन मैं यह जानना चाहता हूं कि कैसे तय करें/कब/कैसे समानांतरता और इसे समझने के लिए। यह समानांतर कैसे होगा ताकि गति घटने के बजाय कोर के साथ बढ़ जाती है?
import Data.Map (Map)
import qualified Data.Map as M
import System.Directory
import Control.Applicative
import Data.Vector (Vector)
import qualified Data.Vector as V
import qualified Data.Text as T
import qualified Data.Text.IO as TI
import Data.Text (Text)
import System.FilePath ((</>))
import Control.Parallel.Strategies
import qualified Data.Set as S
import Data.Set (Set)
import GHC.Conc (pseq, numCapabilities)
import Data.List (foldl')
mapReduce stratm m stratr r xs = let
mapped = parMap stratm m xs
reduced = r mapped `using` stratr
in mapped `pseq` reduced
type Histogram = Map Text Int
rootDir = "/home/masse/Documents/text_conversion/"
finnishStop = ["minä", "sinä", "hän", "kuitenkin", "jälkeen", "mukaanlukien", "koska", "mutta", "jos", "kuitenkin", "kun", "kunnes", "sanoo", "sanoi", "sanoa", "miksi", "vielä", "sinun"]
englishStop = ["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]
isStopWord :: Text -> Bool
isStopWord x = x `elem` (finnishStop ++ englishStop)
textFiles :: IO [FilePath]
textFiles = map (rootDir </>) . filter (not . meta) <$> getDirectoryContents rootDir
where meta "." = True
meta ".." = True
meta _ = False
histogram :: Text -> Histogram
histogram = foldr (\k -> M.insertWith' (+) k 1) M.empty . filter (not . isStopWord) . T.words
wordList = do
files <- mapM TI.readFile =<< textFiles
return $ mapReduce rseq histogram rseq reduce files
where
reduce = M.unions
main = do
list <- wordList
print $ M.size list
pdfs पाठ फ़ाइलों के लिए के रूप में, मैं उपयोग कर रहा हूँ पाठ फ़ाइलों के लिए तो मैं उन्हें प्रदान नहीं कर सकते परिवर्तित, लेकिन इस प्रयोजन के लिए, लगभग किसी भी पुस्तक/प्रोजेक्ट गुटेनबर्ग से किताबें करना चाहिए।
संपादित: स्क्रिप्ट
'हिस्टोग्राम = फ़ोल्डर (\ के -> एम .insertWith '(+) के 1) एम .empty। फ़िल्टर (नहीं। istoptop)। T.words' को 'फ़ोल्ड' का उपयोग करना चाहिए। 'फ़ोल्डर' गहराई से एक गड़बड़ी बनाता है क्योंकि सूची 'मानचित्र' बनाने से पहले बहुत लंबी है। –
यदि आप एक छोटा और पूरा उदाहरण प्रदान करेंगे तो ऐसे प्रश्न का उत्तर देना बहुत आसान होगा। अधिक विस्तार से देखे बिना: क्या आप सुनिश्चित हैं कि 'rseq'' mapReduce' के पहले तर्क के रूप में पर्याप्त है कि काम का प्रत्येक हिस्सा वास्तव में समानांतर में किया जाता है? समानांतर कार्यों की अच्छी ग्रैन्युलरिटी सुनिश्चित करने के लिए पर्याप्त 'पैरामैप' में प्रति सूची तत्व के अनुसार काम की मात्रा कितनी बड़ी है? क्या आपने प्रत्येक कार्यक्रम पर क्या चल रहा है यह देखने के लिए अपने प्रोग्राम पर थ्रेडस्कोप चलाने की कोशिश की है? क्या आपने कचरा संग्रहण में कितना समय व्यतीत किया है, यह देखने के लिए आपने '+ आरटीएस-एस 'के साथ दौड़ने की कोशिश की है? – kosmikus
कोसमिकस, आपका पूरा उदाहरण किस प्रकार का है? आयात के अलावा कि स्क्रिप्ट पूरी तरह से चलाने योग्य है। आरएसईसी/rdeepseq के लिए, मैं किसी भी भाग्य के साथ अन्य संयोजनों के साथ कोशिश की। पैरामैप के लिए, मैंने parListChunk और parListN के साथ मानचित्र का भी प्रयास किया। और थ्रेस्स्कोप के लिए, कार्रवाई और जीसी दोनों तेजी से लग रहा था। - ने कहा कि यह 60% कार्य समय था, जो -एन 1 मामले से बेहतर था। – Masse