[Haskell-cafe] How can we detect and fix memory leak due tolazyness?

Brian Hulley 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
> where
>   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 -

Regards, Brian.
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 mailing list