Reviving this old mail from Guillaume.

I did an analysis on a huge model (>2M entities) we have:
- .mse file: 372.5 MB
- .image file without the model: 86.9 MB
- image with model: 692.8 MB (thus apparently 605,9 MB used by the model)

Then I did a small experiment: I removed the four instance variables of FAMIXSourcedEntity (sourceAnchor, sourceLanguage, comments, declaredSourceLanguage) and replaced them by variables in the privateState

for example:

FAMIXSourcedEntity>>comments
    "Returns the list of comments defined for the entity."
    
    <MSEProperty: #comments type: #FAMIXComment opposite: #container> <multivalued> <derived>
    <MSEComment: 'list of comments defined in the entity'>
    
    ^comments

becomes

FAMIXSourcedEntity>>comments
    "Returns the list of comments defined for the entity."
   
    <MSEProperty: #comments type: #FAMIXComment opposite: #container> <multivalued> <derived>
    <MSEComment: 'list of comments defined in the entity'>
    "^ comments"
    ^ self privateState cacheAt: #comments ifAbsentPut: nil

As a result, the .image file is 673.3 MB (thus apparently 586,4 MB used by the model)
Not huge, but almost 20 MB saved, 3% of the initial memory

nicolas

On 10/11/2016 20:49, stepharo wrote:

Thanks

A task of Pavel will be to see how slots usage can reduce that space lost.

For the empty collection having a kind of
    - sharing an #() in a classVar
    - creating a new collection on use could be a solution.

Le 7/11/16 à 12:16, Guillaume Larcheveque a écrit :
Hi Moose users,

as you may know, at Synectique we experiment lots of issues about memory usage.
That's why i had a look at the number of unused instance variables in one of our system loaded with a big model from one of our main customer.

Total instance variables: 26.852.653
Used instance variables: 17.393.938
Empty collections: 5.023.508
Recoverable instance variables: 14.482.223

The recoverable instance variables are those with nil or an empty collection (or MultiValueLink)

As you can see, we can save a lot of memory :-)

Here is my (dirty) code to get that:

countUsedInstanceVariableInForSubInstances: aClass
| usedInstNbr instNbr emptyCollNbr |
usedInstNbr := 0.
instNbr := 0.
emptyCollNbr := 0.
aClass
allSubInstancesDo: [ :anEntity | 
instNbr := instNbr + anEntity class allInstVarNames size.
anEntity class allInstVarNames
doWithIndex: [ :e :i | 
(anEntity instVarAt: i)
ifNotNil: [ :content | 
([ 
content isEmpty.
emptyCollNbr := emptyCollNbr + 1.
false ]
on: MessageNotUnderstood
do: [ false ])
ifFalse: [ usedInstNbr := usedInstNbr + 1 ] ] ] ].
^ {('Used instance variables' -> usedInstNbr).
('empty collections' -> emptyCollNbr).
('Recoverable instance variables' -> (instNbr - (usedInstNbr - emptyCollNbr))).
('Total instance variables' -> instNbr)}

--
Guillaume Larcheveque



_______________________________________________
Moose-dev mailing list
Moose-dev@list.inf.unibe.ch
https://www.list.inf.unibe.ch/listinfo/moose-dev



_______________________________________________
Moose-dev mailing list
Moose-dev@list.inf.unibe.ch
https://www.list.inf.unibe.ch/listinfo/moose-dev

-- 
Nicolas Anquetil -- MCF (HDR)
Project-Team RMod