How do I get the memory size of a BigInt?

How do I get the memory size of a BigInt?
What I tried:

julia> x=big(3)^300
136891479058588375991326027382088315966463695625337436471480190078368997177499076593800206155688941388250484440597994042813512732765695774566001

julia> sizeof(x)
16

julia> Base.summarysize(x)
16

Thanks!

1 Like

There is

x=big(3)^300

@show Base.GMP.MPZ.sizeinbase(x,2)

yielding

Base.GMP.MPZ.sizeinbase(x, 2) = 476

but it doesn’t seem to be part of the public interface.

OK, this provides the number of digits in the given base.

I was more thinking about the actual amount of memory used. But I realize now that this is probably a bad question since Julia uses GMP for BigInts and GMP has its own nontrivial memory management and allocates memory outside the control of Julia.

So your answer provides a lower bound and, assuming that the overhead is not that big, a good estimator for the actual memory consumption.

Thank you,

I think you can get the allocated memory via the .alloc field, e.g.

julia> b = big(2)^512; (b.size, b.alloc)
(9, 13)

julia> 13 * Base.GMP.BITS_PER_LIMB / 8 # total number of allocated bytes
104.0
3 Likes

Also, what is documented is ndigits:

julia> ndigits(x, base=2)
476
2 Likes

Thank you!

j=big(17)^400;

for i = 1:10
    b=j^i
    limbs = b.size
    alloc = b.alloc
    minlimbs = ndigits(b, base=2) / Base.GMP.BITS_PER_LIMB 
    println("$alloc $limbs  $minlimbs")
end

gives

allocs #limbs ndigits/limbsize

52 52  51.09375
81 77  76.640625
107 103  102.1875
132 128  127.734375
158 154  153.28125
183 179  178.828125
209 205  204.375
234 230  229.921875
260 256  255.46875

so we have
b.size = #limbs = ceil( ndigits(b,2)/ limbsize) and
b.alloc = actually allocated memory (in units of limbsize)

I really think that summarysize should be taught about this so that it reports the memory used by BigInts accurately. Same deal with BigFloats too. Anyone want to file an issue or open a PR?

3 Likes

This is probably already fine for BigFloat as they store their data inline in a String field.

1 Like
1 Like