Hallo Mensen,
Ik ben een datastructuur aan het opbouwen van +/- 100 tabellen. Elk van deze tabellen is n bij n groot en elke cel verwijst naar een object. Op het moment dat ik deze tabellen ga vullen is deze n onbekend. Het enige wat ik kan is een schatting geven, maar ik kan niet garanderen dat de schatting altijd groter is dan n. Nu dacht ik: gebruik geneste HashMap's.
Zo gezegd, zo gedaan. Nu had ik een voorbeeld run waarbij deze n 500 was. Het resultaat was 700+ MB aan geheugengebruik. Dit leek mij een beetje veel.
Een HashMap met 500 items is vaak groter vanwege zijn marge (ik schat een factor 1.2). Daarom maakte ik het volgende rekensommetje met n = 600:
De HashMap in de 2e dimensie is: 600 * (4bytes (values) + 4bytes (keys)) = 4.9 KB
De HashMap in de 1e dimensie bevat 500 van deze 4.9KB hashtables (+ nog wat null pointers die ik even verwaarloos) = 2.4 MB
En ik heb 100 van deze tabellen: 100 * 2.4 MB = 240MB
Deze 240MB is een kleine factor 3 kleiner dan de 700+ MB die ik zag in de taskmanager. Nu kan ik me voorstellen dat ik wat overhead her en der ben vergeten, maar kan me niet voorstellen dat dit voor een factor 2 zorgt.
Nu vroeg ik me af, maar ik een rekenfout? Heeft bijvoorbeeld een HashMap meer ruimte nodig dan 4bytes voor elke key en 4bytes voor elke value?
De andere vraag die ik wilde stellen: Zijn er dat structuren die effectiever zijn qua geheugengebruik? Ik dacht zelf eerst aan de HashMap omdat ik niet weet hoeveel items ik moet opslaan bij het begin.
Ik ben een datastructuur aan het opbouwen van +/- 100 tabellen. Elk van deze tabellen is n bij n groot en elke cel verwijst naar een object. Op het moment dat ik deze tabellen ga vullen is deze n onbekend. Het enige wat ik kan is een schatting geven, maar ik kan niet garanderen dat de schatting altijd groter is dan n. Nu dacht ik: gebruik geneste HashMap's.
Zo gezegd, zo gedaan. Nu had ik een voorbeeld run waarbij deze n 500 was. Het resultaat was 700+ MB aan geheugengebruik. Dit leek mij een beetje veel.
Een HashMap met 500 items is vaak groter vanwege zijn marge (ik schat een factor 1.2). Daarom maakte ik het volgende rekensommetje met n = 600:
De HashMap in de 2e dimensie is: 600 * (4bytes (values) + 4bytes (keys)) = 4.9 KB
De HashMap in de 1e dimensie bevat 500 van deze 4.9KB hashtables (+ nog wat null pointers die ik even verwaarloos) = 2.4 MB
En ik heb 100 van deze tabellen: 100 * 2.4 MB = 240MB
Deze 240MB is een kleine factor 3 kleiner dan de 700+ MB die ik zag in de taskmanager. Nu kan ik me voorstellen dat ik wat overhead her en der ben vergeten, maar kan me niet voorstellen dat dit voor een factor 2 zorgt.
Nu vroeg ik me af, maar ik een rekenfout? Heeft bijvoorbeeld een HashMap meer ruimte nodig dan 4bytes voor elke key en 4bytes voor elke value?
De andere vraag die ik wilde stellen: Zijn er dat structuren die effectiever zijn qua geheugengebruik? Ik dacht zelf eerst aan de HashMap omdat ik niet weet hoeveel items ik moet opslaan bij het begin.