gpt4 book ai didi

haskell - 修复一个特别模糊的 Haskell 空间泄漏

转载 作者:行者123 更新时间:2023-12-04 07:58:01 24 4
gpt4 key购买 nike

因此,在从我用来将推文数据分解为 n-gram 的一些 Haskell 中挤出最后一点性能之后,我遇到了空间泄漏问题。当我分析时,GC 使用了大约 60-70% 的进程,并且有大量内存部分专门用于拖动。希望当我出错时,一些 Haskell 大师能够提出建议。

{-# LANGUAGE OverloadedStrings, BangPatterns #-}
import Data.Maybe
import qualified Data.ByteString.Char8 as B
import qualified Data.HashMap.Strict as H
import Text.Regex.Posix
import Data.List
import qualified Data.Char as C

isClassChar a = C.isAlphaNum a || a == ' ' || a == '\'' ||
a == '-' || a == '#' || a == '@' || a == '%'

cullWord :: B.ByteString -> B.ByteString
cullWord w = B.map C.toLower $ B.filter isClassChar w

procTextN :: Int -> B.ByteString -> [([B.ByteString],Int)]
procTextN n t = H.toList $ foldl' ngram H.empty lines
where !lines = B.lines $ cullWord t
ngram tr line = snd $ foldl' breakdown (base,tr) (B.split ' ' line)
base = replicate (n-1) ""

breakdown :: ([B.ByteString], H.HashMap [B.ByteString] Int) -> B.ByteString -> ([B.ByteString],H.HashMap [B.ByteString] Int)
breakdown (st@(s:ss),tree) word =
newStack `seq` expandedWord `seq` (newStack,expandedWord)
where newStack = ss ++ [word]
expandedWord = updateWord (st ++ [word]) tree

updateWord :: [B.ByteString] -> H.HashMap [B.ByteString] Int -> H.HashMap [B.ByteString] Int
updateWord w h = H.insertWith (+) w 1 h

main = do
test2 <- B.readFile "canewobble"
print $ filter (\(a,b) -> b > 100) $
sortBy (\(a,b) (c,d) -> compare d b) $ procTextN 3 test2

最佳答案

一个小的优化是在排序之前过滤数据(使用 HashMap.filter )。这帮助我将最终执行时间缩短了 2 秒。我做的另一件事是使用序列( Data.Sequence )而不是列表(没有明显区别:-( )。我的版本可以找到 here

查看堆配置文件,我认为您的程序中没有空间泄漏:
Space profile

您只是在内存中构建一个相当大的哈希表(377141 个键值对),然后在经过一些处理后将其丢弃。根据Johan's post ,这种大小的哈希表大约需要。 5*N + 4*(N-1) 字 = 3394265*4 字节 ~= 13 MiB,这与堆配置文件显示的一致。剩余空间由键和值占用。在我的机器上,花费在 GC 上的时间大约是 40%,这听起来并不合理,因为您不断地更新哈希表和临时“堆栈”,而没有对数据进行任何计算量很大的事情。因为您需要哈希表的唯一操作是 insertWith ,也许最好使用 mutable data structure ?

更新 : I've rewritten your program using a mutable hash table.有趣的是,速度差异不大,但内存使用情况稍微好一些:

enter image description here

如您所见,为哈希表分配的 block 大小在整个执行过程中保持不变。

关于haskell - 修复一个特别模糊的 Haskell 空间泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com