Speicherverbrauch senken.
-
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?
-
Und müssen deine integralen Variablen alle so groß sein? Reicht da nicht vielleicht auch mal short oder char?
Ja müssen sie, die Struktur erhalte ich von einer externen Bibliothek. Und da sind die Variablen zum einen so angelegt und zum anderen werden sind die Werte auch sehr hoch.
Das mit den Strings bringt aber eher weniger oder? Wenn ich hier nutzen gegen aufwand stelle!
-
Also wenn Deine Strings kürzer als 16 bytes sind, dann ist es vermutlich effektiver und schneller die Strings direkt in der Struktur als char[] zu definieren.
-
Ok. Die Frage ist aber ob ich da immens Speicher einspare. Sagen wir mal halbieren. Wohl eher nicht oder? Bevor ich mir nun mein Programm umstellen!
-
svenja schrieb:
Ok. Die Frage ist aber ob ich da immens Speicher einspare. Sagen wir mal halbieren. Wohl eher nicht oder? Bevor ich mir nun mein Programm umstellen!
Wie lang sind die Strings? Dir muss klar sein, dass jeder CString eine eigene Allokation bedeuetet und das bei kurzen Strings hier natürlich speicher vergeudet wird.
Zusätzlich muss Dirklar sein, dass jede Allokation auf eine Granularität von 16 (soviel ich weiß) gerundet wird. Dazu kommen noch Zeiger für die Verkettung der Blöcke. D.h. evtl. kannst Du davon ausgehen, dass selbst ein kurzer String 32Bytes schluckt.
Zudem, was musst Du da große umbauen.
Du hast die Member der STruktur sicherlich mit Accessors (Gettern/Settern) gekapselt und die Datenmember sind private. Dann kannst Du das Format doch sofort ändern
-
Ok. Wie sieht es mit std::string aus geht das auch braucht der weniger Platz wie CString oder muss es char[] sein?