C++: Komprimera objekt i minnet?

Permalänk
Medlem

C++: Komprimera objekt i minnet?

Hej!

Jag har en ganska teoretisk fråga. Säg att jag har ett objekt, som jag inte kan minska storleken på utan att förlora data. Finns det något sätt för mig att hålla objektet komprimerat i minnet och sedan dekomprimera objektet ("on-the-fly") varje gång det kallas?

Objektet kallas inte jätteofta, så jag tror inte hastigheten på programmet skulle minska jättemycket.

Hoppas ni förstår vad jag menar, om inte ska jag försöka förklara utförligare.

Permalänk
Medlem

Ifall hastigheten inte är av betydelse kan du ju också lagra data på hårddisken. Jag har inte använt det själv men http://www.zlib.net/ kanske klarar det du vill.

Permalänk
Inaktiv

Du kan ju köra på zlib som hawy sa, dock så bör den gå att använda för att komprimera saker i minnet också då det är väldigt abstraherat ifrån zip-filer/hårddisklagring (som många verkar missa när det gäller zlib)

Permalänk
Datavetare

Vad är målet med övningen? Om det bara handlar om att minska mängden RAM du använder så varför inte bara skriva ner bitmönstret för objektet på en fil och sedan minnes-mappa filen?

Då kommer ditt objekt vara en av de absolut första sakerna som åker ut ur fysiskt-RAM (men det är kvar i virtuellt RAM så adressen till objektet är fortfarande giltigt) om det blir ont om plats, men du kan ändå behandla objektet som "vanligt", men ibland kan ett anrop ta ganska lång tid då objektet måste läsas in från fil.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Vad är målet med övningen? Om det bara handlar om att minska mängden RAM du använder så varför inte bara skriva ner bitmönstret för objektet på en fil och sedan minnes-mappa filen?

Då kommer ditt objekt vara en av de absolut första sakerna som åker ut ur fysiskt-RAM (men det är kvar i virtuellt RAM så adressen till objektet är fortfarande giltigt) om det blir ont om plats, men du kan ändå behandla objektet som "vanligt", men ibland kan ett anrop ta ganska lång tid då objektet måste läsas in från fil.

Målet är precis att minska mängden RAM jag använder. Hur skulle jag gå till väga för att göra det du beskriver? Grejen är att den stora mängden minne redan är läst från disk.

Det jag vill åstadkomma är med andra ord att antingen (1) hålla hela objektets struktur komprimerat i minnet som jag beskrev i mitt första inlägg, eller att (2) ha objektet på disk, men komma åt det på samma sätt som om det var i minnet.

Grejen är att programmet är ganska komplext och att göra om alltihop skulle vara alldeles för tidsödande. Det är därför jag letar efter vägar att minska mängden minne på prestandans bekostnad, i princip.

Permalänk
Medlem

Det beror helt på vad det är för typ av objekt du skall jobba mot. Om du pratar om en vanlig klass och en instans av den klassen som du kallar i din kod "helt vanligt" så kan du inte göra så mycket. Minnesstrukturen av en klass, en int, en char eller vad som helst är bestämd och det finns inget stöd att dynamiskt ändra vad som är en int osv i minnet.

Om du däremot pratar om någon typ av data som skall sparas och accessas, låt oss säga en bild så finsn det massor med komprimeringstekniker som du kan använda på själva datan. Sedan har du någon funktion som när den hämtar/ returnerar datan avkoder/packar upp den i det format som behövs internt.

Men du kan liksom inte ha en instans av en klass som automatiskt packas och packas upp i minnet mellan varje interaktion med det. Det hade krävts stöd i språkets grundstruktur för detta.

Visa signatur

Gigabyte Aorus Master | 32gb DDR4 3466MHZ CL14 | Ryzen 3950X | 3080Ti
En lång rad Intel system som barnen fått som speldatorer, VR-dator, massa bärbara, servrar, RPi's och andra boxar :P