[Haskell-cafe] How can we detect and fix memory leak due
brianh at metamilk.com
Mon Aug 7 21:27:42 EDT 2006
Ahn, Ki Yung wrote:
> Recently, I'm facing the dark side of laziness
> -- the memory leak because of laziness.
> The following is the code that leaks memory.
> sctAnal gs = null cgs || all (not . null) dcs
> gs' = fixSize compose $ Set.fromList [TT (x,y,cs)  | To _ x y
> cs<-Set.toList gs]
> cgs = [z | z@(TT (x,y,cs) _)<-Set.toList gs', x==y]
> dcs = [[c| c@(a,D,b)<-Set.toList cs , a==b] | TT (_,_,cs) _<-cgs]
> compose gs = trace ("## "++show (Set.size gs)) $ foldr checkInsert
One thing is that (foldr) is not recommended if you can at all avoid it. I
think you may be able to use (foldl') here (if you also swap the arg order
for checkInsert) which behaves as a strict fold operation so it doesn't
waste space building up thunks.
> gs $ do TT (x1,y1,cs1) l1 <- Set.toList gs
> TT (_,y2,cs2) l2 <- takeWhileTTfrom y1 . Set.toList $ setGT (TT
> (y1,Al""(-1),Set.empty) ) gs
> return $ TT (x1,y2,cs1 `comp` cs2) (l1++y1:l2)
> takeWhileTTfrom y = takeWhile (\(TT (y',_,_) _) -> y==y')
> checkInsert x s
-- checkInsert s x -- if you use foldl'
> | Set.member x s = s
> | otherwise = Set.insert x s
Sorry I can't help more at the moment -
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.
More information about the Haskell-Cafe