Tôi đang cố gắng che giấu đầu xung quanh các chiến lược song song. Tôi nghĩ rằng tôi hiểu những gì mà mỗi combinators làm, nhưng mỗi khi tôi cố gắng sử dụng chúng với hơn 1 lõi, chương trình chậm đáng kể.Chiến lược song song hiệu quả
Ví dụ một thời gian trở lại tôi đã cố gắng để tính toán biểu đồ (và từ họ từ duy nhất) từ ~ 700 tài liệu. Tôi nghĩ rằng việc sử dụng mức chi tiết cấp tệp sẽ ổn. Với -N4
tôi nhận được 1.70 số dư công việc. Tuy nhiên với -N1
nó chạy trong một nửa thời gian hơn là với -N4
. Tôi không chắc câu hỏi này thực sự là gì, nhưng tôi muốn biết làm thế nào để quyết định nơi/khi nào/làm thế nào để song song và đạt được một số hiểu biết về nó. Làm thế nào điều này sẽ được song song để tăng tốc độ với lõi thay vì giảm?
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
Đối với các tệp văn bản, tôi đang sử dụng pdf được chuyển đổi thành tệp văn bản, nhưng với mục đích, hầu như mọi sách/sách từ dự án gutenberg đều nên làm.
Sửa: Thêm hàng nhập khẩu để kịch bản
'histogram = foldr (\ k -> M.insertWith '(+) k 1) M.empty. bộ lọc (not. isStopWord). T.words' nên sử dụng 'foldl''. 'Foldr' xây dựng một đoạn sâu như danh sách dài trước khi nó có thể bắt đầu xây dựng' Bản đồ'. –
Sẽ dễ dàng hơn nếu bạn trả lời một câu hỏi như vậy nếu bạn cung cấp một ví dụ nhỏ và đầy đủ. Nếu không tìm kiếm nhiều chi tiết: Bạn có chắc chắn rằng 'rseq' là arg đầu tiên của' mapReduce' là đủ để buộc mỗi đoạn công việc thực sự được thực hiện song song không? Số lượng công việc phải được thực hiện cho mỗi phần tử danh sách trong 'parMap' đủ lớn để đảm bảo độ chi tiết tốt của các tác vụ song song? Bạn đã thử chạy threadscope trên chương trình của bạn để xem những gì đang xảy ra trên mỗi lõi? Bạn đã thử chạy với '+ RTS -s' để xem có bao nhiêu thời gian dành cho việc thu gom rác không? – kosmikus
kosmikus, bạn có ý nghĩa gì? Ngoài việc nhập khẩu, tập lệnh đó hoàn toàn có thể chạy được. Đối với rseq/rdeepseq, tôi đã thử với các kết hợp khác không có may mắn. Đối với parMap, tôi cũng đã thử bản đồ với parListChunk và parListN. Và đối với threadscope, có vẻ như đều đặn cả hành động lẫn gc. -s nói rằng đó là 60% thời gian làm việc, tốt hơn so với trường hợp -N1. – Masse