Data.Binary.Put monad'ını bir diğerine sarmaya çalışıyorum, daha sonra "kaç tane bayt yazacağı" veya "dosyadaki geçerli konum nedir" gibi sorular sorabilirim. Ama çok önemsiz sarar gibi:Data.Binary.Put monad'ı neden bir bellek sızıntısı oluşturur?
data Writer1M a = Writer1M { write :: P.PutM a }
or
data Writer2M a = Writer2M { write :: (a, P.Put) }
büyük uzay sızıntısına yol ve program genellikle (4GB RAM yukarı aldıktan sonra) çöküyor. İşte ben bugüne kadar denedim budur:
-- This works well and consumes almost no memory.
type Writer = P.Put
writer :: P.Put -> Writer
writer put = put
writeToFile :: String -> Writer -> IO()
writeToFile path writer = BL.writeFile path (P.runPut writer)
-- This one will cause memory leak.
data Writer1M a = Writer1M { write :: P.PutM a }
instance Monad Writer1M where
return a = Writer1M $ return a
ma >>= f = Writer1M $ (write ma) >>= \a -> write $ f a
type WriterM = Writer1M
type Writer = WriterM()
writer :: P.Put -> Writer
writer put = Writer1M $ put
writeToFile :: String -> Writer -> IO()
writeToFile path writer = BL.writeFile path (P.runPut $ write writer)
-- This one will crash as well with exactly the
-- same memory foot print as Writer1M
data Writer2M a = Writer2M { write :: (a, P.Put) }
instance Monad Writer2M where
return a = Writer2M $ (a, return())
ma >>= f = Writer2M $ (b, p >> p')
where (a,p) = write ma
(b,p') = write $ f a
type WriterM = Writer2M
type Writer = WriterM()
writer :: P.Put -> Writer
writer put = Writer2M $ ((), put)
writeToFile :: String -> Writer -> IO()
writeToFile path writer = BL.writeFile path (P.runPut $ snd $ write writer)
Ben Haskell yeniyim ve bu benim için hiçbir sense yapar, ama sarıcı monads böylece orada tahmin ediyorum çok önemsiz görünüyor eksik olduğum belli bir şey.
Baktığınız için teşekkür ederiz.
GÜNCELLEME
: http://hpaste.org/43400/why_wrapping_the_databinarypUpdate2: Burada sorunu gösteren bir örnek kod da bu soruya here bir ikinci bölümü vardır.
Hangi compiler bayraklarını kullanıyorsunuz? –
-O2 ile denediğimi sorduktan sonra (daha önce hiç kullanmadım) ancak bellek ayağı baskısı değişmedi. –
Önemsiz bir test programı gönderebilir misiniz, böylece burada başkaları kendi başlarına inşa etmek zorunda kalmazlar mı? –