getting a grip on memory usage
Jeffrey Palmer
jeffrey.palmer@acm.org
Wed, 22 May 2002 13:21:20 -0500
On Wednesday 22 May 2002 12:48 pm, Hal Daume III wrote:
> so i have a function that is eating *tons* of memory. my application
> is clustering and i put everything in UArrays or Arrays. for
> clustering 5 data points with 4 features (a tiny tiny set) the
> program gobbles 350mbs! most of the usage is coming from this
> distance function:
>
Ahh, a fellow memory abuser. ;)
I recently ran into very similar behavior while implementing a Haskell=20
rendering engine. I was using a lookup table deep within a loop, and=20
references to the lookup table seemed to be allocated as each=20
computation was deferred. I immediately allocated over 150MB for a=20
very simple render.
Try turning on heap profiling, and see if you get anything interesting. =20
There is an option to display "named" references (or something like=20
that) that might provide insight into what's responsible.
In my case, I rewrote my monad to be stricter (and used case), and=20
forced a result data structure to be strict in its components. This=20
forced complete evaluation of all of the elements prior to returning=20
the result. I don't know if you have a nice place to put something=20
like that, but it's worth a look.
When all was said and done, my application memory usage never went above=20
4MB, which is exactly where I expected it to be.
Check out this link:
http://users.aber.ac.uk/ajc99/stricthaskell.html
It has some interesting ways of forcing evaluation at various times,=20
etc., although I prefer other ways of obtaining these results. =20
However, it is a good list of candidate changes for debugging.
Enjoy!
=09- j
--=20
The river is moving.
The blackbird must be flying.