Best way to determine the memory footprint of an object

W

Wes Gamble

I'd like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Any advice is appreciated.

Thanks,
Wes
 
R

Robert Klemme

I'd like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Marshal doesn't text - the output is binary. But there's another
problem: what do you regard an object's size? Is it just the instance?
Is it the instance plus certain members like Arrays, Strings and
numbers? Is it the whole graph of objects reachable from your object?
In any case how do you deal with aliasing, i.e. objects referenced by
more than one object? etc.

Kind regards

robert
 
T

Tomasz Wegrzanowski

I'd like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Any advice is appreciated.

Take a look at object printing code in:
http://t-a-w.blogspot.com/2007/02/ruby-and-judy.html

It prints reports like:
IV Table of object Complex(1.0, 2.0)
Flags = 2
Class = Complex
IV_TBL:
* Bins: 11
* Entries: 2
* Bin 0:
* Entry
* Hash: 10802
* Key: @real
* Record: 1.0
* Bin 1: empty
* Bin 2: empty
* Bin 3: empty
* Bin 4: empty
* Bin 5: empty
* Bin 6: empty
* Bin 7: empty
* Bin 8:
* Entry
* Hash: 10810
* Key: @image
* Record: 2.0
* Bin 9: empty
* Bin 10: empty
Memory use: 88 bytes

It only works with normal objects, not anything special (like strings,
arrays, hashes, floats etc.), becuase I never needed anything else.

Object uses memory for:
* main data structure (flags, class pointer, table of instance
variables pointer)
* instance variable table
* some extra storage for non-standard objects
* associated singleton class, if any (if you include it in the count)
* instance variables are objects unless they're immediate values (if
you include them in count)
* some undefined memory allocator overhead for all of the above
 
M

Mauricio Fernandez

I'd like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Any advice is appreciated.

http://eigenclass.org/hiki.rb?ruby+space+overhead

A rule of thumb:

for normal objects the memory footprint is around 100 bytes plus 20 bytes per
instance variable (applies to objs. with <55 instance variables).

(Apply recursively if you want to consider referenced objects too.)

See the above link for more details regarding Arrays, Hashes, Symbols,
Structs, etc...

--
Mauricio Fernandez - http://eigenclass.org - singular Ruby
** Latest postings **
Towards compatibility with Ruby 1.9: Rails, Rake, RubyGems...
http://eigenclass.org/hiki.rb?porting-rails-to-ruby-1.9
Ruby interpreting Prolog' interpreting Lisp interpreting Lisp solving FizzBuzz
http://eigenclass.org/hiki.rb?lisp-in-lisp-and-prolog-and-ruby
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top