Dear café,


I don't know, whether this is the right place to ask, but I'll try :-)


If I would like to know size of the list in the memory (after complete evaluation, e.g. deepseq). The type is [( Int, [([Int],[Int])] )].


So we have K tuples of the type (Int,[([Int],[Int])])

Each tuple has N tuples of the type ([Int],[Int])

and each of these lists M elements long (yes, both a are of the same length).


Top level list needs (on 64bit CPU) 8 bytes for pointer to elements, 8 bytes to point to another element, some more "expenses", probably yes, tag, anything else?


So we have K*(16+XXX), where XXX is for size of (Int,[([Int],[Int])]).


Tuple needs 8 bytes for each pointer, so XXX = 16 + YYY, where YYY is the size of the [([Int],[Int])] list. It needs 8 + 8 bytes on the list, we have N such elements, thus YYY = N * (16 + ZZZ), where ZZZ is size of the ([Int],[Int]).


Again tuple, so 16 bytes + 2*(M * (16 + 8))

-- 16 bytes for 2 tuple elements

-- 2 for two lists

-- every list 16 bytes for list itself

-- 8 bytes for Int


So ZZZ = 16 + 2*(M * (16 + 8)), thus

YYY = N * (16 + 16 + 2*(M * (16 + 8))), thus

XXX = 16 + N * (16 + 16 + 2*(M * (16 + 8))), thus

size = K * (16 + 16 + N * (16 + 16 + 2*(M * (16 + 8))))

     = K* (32 + N* (32 + M*48) )


Am I right? Roughly right? Or totally wrong?


E.g. for K = 25, N = 10000, M = 7 we get cca 88MiB ?


Why am I asking? In reality the memory consumption is much higher, so I must be missing some extras, e.g. each memory chunk extra 8 bytes for GC, extra for tag, extra to point to VMT?


Regards,

Dušan