Speicherverbrauch senken.
-
Meine Mfc Applikation liesst eine Menge Daten von einem anderen System aus. Diese Daten speichere ich mir in STL Containern. Mein Speicherverbrauch steigt dabei auf 700 MB an. Ist es irgendwie möglich die Daten zu komprimieren. Liegt das an STL oder ist das halt so?
-
Vielleicht musst du ja nicht alle Daten speichern (z.B. weil du sie teilweise berechnen kannst, wenn sie gebraucht werden). Aber ohne mehr Infos über die Daten, die du speicherst, wirst du wohl kaum eine vernünftige Antwort bekommen...
-
Der Overhead kann schon alleine dadurc enstehen, dass Du maps oder Listen von kleinen Objekten hast.
Dadurch steigt der Overhead immens an.
-
Die Daten stammen von einer SPS. Es sind Variablen. Und über jede Variable benötige ich Informationen. Diese werden dem Benutzer angezeigt. Sprich es ist nicht möglich bestimmte Daten nicht zu speichern sondern zu berechnen. Und ja es sind sehr viele kleine Objekte da es sehr sehr viele Variablen sind. Weiß aber nicht wie das anders lösbar ist.
-
Dann zeige mal die Strukturen, die Du verwendest und wie Du die Daten darin ablegst.
Am Besten sagst Du uns auch wieviele Infos in jeder der Vectoren/Maps/Listen etc. abgelegt ist.
-
Ich habe eine Klasse verwendet für die Spiecherung der Daten. Die Klasse umfasst Zugriffsfunktionen 10 Membervariablen mit zugehörgien Zugriffsfunktionen.
In der Map befinden ca 500.000 Objekte. Ich sagte ja sehr sehr viele.
-
D.h. nur eine Map?
Wie groß ist die Struktur?BTW: Bei dieser Menge an Daten, was regen Dich da 700MB auf?
-
D.h. nur eine Map?
Ja
Wie groß ist die Struktur?
Was meinst du, größe in MB? Wie bekomme ich das raus?
BTW: Bei dieser Menge an Daten, was regen Dich da 700MB auf?
Ja ich weiß es sind auch eine Menge dachte halt nur dass man mit ein paar Tricks dies etwas verkleinern kann.
-
svenja schrieb:
Wie groß ist die Struktur?
Was meinst du, größe in MB? Wie bekomme ich das raus?
sizeof kann es dir verraten. Du kannst sie aber auch mal posten.
-
Nein kann sie nicht posten. Gibt gründe dafür. Aber ich sagte ja schon 10 Membervariablen. int, bools, und strings. Also so groß ist eine Struktur nicht
-
Strings (char-Array? std::string? CString? was anderes?) können ja ganz schön groß werden, je nachdem. Wie gesagt, sizeof verrät es dir.
-
Zeig doch einfach mal was Du in der map speicherst. Ein paar Zeilen Code sprechen doch Bände!
-
Also sizeof liefert mir das ergebnis 56. Hilft das nun mein Problem zu lösen
-
Zeig doch einfach mal was Du in der map speicherst. Ein paar Zeilen Code sprechen doch Bände!
Es sind doch nur ein paar Variablen. CString, bool, int, und das 10 Stück nichts weiter.
-
Ja genau wie bienchen mir zustimmt. Hilft das wenn du die Varibalen siehst. Oder was willst du sehen?
-
Ist es. Man kann zumindest abschätzen wieviele andere Objekte mit erzeugt werden, bzw. wie groß die Basis-Struktur ist.
-
typedef struct tagITCADSSYMBOL { tagITCADSSYMBOL() :Comment("") ,Datatype(ADST_VOID) ,IndexGroup(0) ,IndexOffset(0) ,Name("") ,ShortName("") ,Size(0) ,SubSymbolCount(0) ,Type("") { } CString Comment; long IndexGroup; long IndexOffset; CString Name; CString ShortName; int Size; int SubSymbolCount; CString Type; }ITcAdsSymbol;
-
Und sagt das nun was aus. Lässt sich damit nun das Problem lösen?
-
Für was habe ich nun den Quellcode gepostet. Habe ich doch gesagt bringt nichts.
-
sizeof bringt jedenfalls nix bei CString, da wird immer 4 Bytes zurückgegeben. Deine Struktur ist also wesentlich größer, abhängig davon, wie CString intern arbeitet und wie groß deine Strings sind. Wahrscheinlich wäre strlen(cs,GetBuffer())*sizeof(TCHAR) oder sowas sinnvoller...
Vielleicht könnte es ja schon helfen, deine Strings zusammenzufassen (also alles in einem CString halten und per Trennzeichen trennen) oder so. Und müssen deine integralen Variablen alle so groß sein? Reicht da nicht vielleicht auch mal short oder char?