Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/.NET] Geheugengebruik van (veel) bitmaps

Pagina: 1
Acties:

  • Douwe63
  • Registratie: September 2003
  • Laatst online: 28-11 21:35
Ik ben bezig met een applicatie in C# waarin veel (zowel kleine als grote) bitmaps gebruikt worden. Deze zitten in een aantal List<> and Map<> constructies en deze zitten weer als members in een data class. Als ik deze data class middels binary serialization naar disk wegschrijf is de grootte 18 MB, echter, de complete geheugenbelasting van deze bitmaps in memory is ruim 1GB.

Tijdens het testen zag ik wel dat er veel geheugen gebruikt wordt maar ik nam aan dat dit kwam omdat ik flink aan het processen ben met grotere (tijdelijke) bitmaps maar deze blijken bij nadere inspectie helemaal niet verantwoordelijk voor het enorme geheugengebruik.

Blijkbaar 'vreten' de afzonderlijke/kleine bitmaps in het geheugen een stuk meer ruimte dan op disk. Iemand een idee of hier nog iets aan te doen is? Kan ik nog iets sturen aan de manier waarop .NET geheugen claimt voor een bitmap?

  • Jeroen V
  • Registratie: Februari 2004
  • Laatst online: 27-11 15:33

Jeroen V

yadda yadda yadda

Dispose je de images netjes als je er klaar mee bent?

  • Douwe63
  • Registratie: September 2003
  • Laatst online: 28-11 21:35
Jeroen V schreef op donderdag 24 februari 2011 @ 16:12:
Dispose je de images netjes als je er klaar mee bent?
Jazeker, dat is met zoveel plaatjes inderdaad van levensbelang ;)

Ik ga wel iets verzinnen met een stream waarin ik de bitmaps opsla in het png formaat (lossless compressie) en dan op het moment dat ik zo'n plaatje nodig heb genereer ik weer een echte bitmap die ik dispose zodra ik er mee klaar ben.

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Je kunt voor dat idee beter een memory stream gebruiken, sneller en misschien is dat ook compacter dan het gewoon in geheugen houden.

Heb je trouwens VS2010 Pro of Express? In pro kun je een analyse doen van het geheugen gebruik van je applicatie zodat je beter weet waar het zit.

Verder kan het heel goed zijn dat je images omdat ze waarschijnlijk redelijk lang gereferenced blijven verhuisd zijn naar de 3e generatie in de garbage collector, dit betekend dat ze niet heel snel gecontroleerd zullen worden en ook niet snel verwijderd, verder is het zelfs zo dat als je computer genoeg vrij geheugen heeft dat de GC dan een hele lange tijd geen 3e generatie controle doet omdat het toch niet nodig is. Force bij dit soort 'problemen' dus altijd zelf een collect via GC.Collect(...);

Verder moet je je af vragen als het bovenste waar is of dat echt een probleem is.

~ Mijn prog blog!