[Haskell-cafe] Space leaks
Peter Gavin
pgavin at gmail.com
Thu Jul 17 23:00:26 EDT 2008
Thanks for the responses.
This is basically what I've got looks like (grossly simplified):
data Monad m => Foo m a b =
Foo
{ action :: m (Foo m a b, b)
, update :: a -> Foo m a b
}
The driver loop injects new values with update, and executes action
whenever it's ready to, replacing the old Foo with the newly returned Foo.
I finally fixed the space leak it by inserting SPECIALIZE pragmas for
Foo IO a b on every function that creates a Foo. I'm not sure if I can
remove all the strictness annotations I've accumulated yet, though.
This is a bit disconcerting, though, because in the future I'd like to
not use IO and use a strict State instead. I hope I won't have to
specialize for every monad that ends up getting used.
Thanks again,
Pete
Jefferson Heard wrote:
> Peter, from 500 feet, we can't see much, but your strictness might
> actually be your problem depending on what "largish" looks like and
> whether you're reading your data from disc. It's entirely possible
> that your data structure updates or disc reads are head-strict and
> you're evaluating or loading the entirety of data in memory at a
> single update.
>
> -- Jeff
>
> On Thu, Jul 17, 2008 at 2:58 PM, Luke Palmer <lrpalmer at gmail.com> wrote:
>> On Thu, Jul 17, 2008 at 12:14 PM, Peter Gavin <pgavin at gmail.com> wrote:
>>> Hello everyone,
>>>
>>> I have this piece of code I've been working on, and I've been stuck on
>>> tracking down a space leak in it for some time now. The code is essentially
>>> a tight loop that updates a rather largish data structure with embedded
>>> functions that are called by the driver loop. The code doesn't accumulate
>>> any data as the loop runs (at least deliberately), so I would expect the
>>> memory profile to be flat. Unfortunately, the profile is a wedge :) I've
>>> added bangs and `seq` literally everywhere, and it looks (to me at least)
>>> like there's nothing left to be lazily evaluated anywhere. I've used
>>> retainer profiling, and the functions that are leaking space according to
>>> the profiler output are strict throughout.
>> I don't know what I can suggest as for general tactics. Without
>> seeing the code it's hard to say what could be happening. Just
>> remember that strictness is not always the answer!
>>
>> >From the very limited amount of information I got from this
>> description, my first guess would be the data structure itself, or the
>> functions inside it. If it's lazily generated, then you might not be
>> seeing the full amount of space it's taking up at once. But that's
>> just a guess.
>>
>> Luke
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>
>
>
More information about the Haskell-Cafe
mailing list