Enormer Speicherbedarf :-?



  • Hallo,

    ich habe gerade bemerkt daß eine kleine Test-Applikation von mir sehr viel Arbeits-Speicher benötigt und wollte fragen an was das liegen kann ?

    Ich erzeuge zwei CStdioFile und ein CStringArray Objekte um mit

    while (inFile.ReadString(Zeile)) {..} und
    if (...) { catchedwords.Add(Zeile); } und dann

    for (int i=0;i<catchedwords.GetSize();i++)
    {OutFile.WriteString(Zeile));
    ...

    Ein array zu füllen und dann wieder schreiben. Dazu lese ich eben ein File Zeilenweise ein (siehe oben) schau nach wie lang die Zeile ist und ein paar andere Dinge um dann ggfs. eben denr writeString auszuführen

    . Jetzt habe gesehen daß beim Einlesen eine 3,5MB Datei unglaubliche 35MB Speicher zugewiesen werden :-? Selbst wenn der die kompletten 3,5MB in den Array schreiben würde üdrfte er doch max. um die 3,5 MB auch allokieren :-? Und selbst wenn alle ReadString daten Auch im RAM bleiben sind wir bei 7,0 MB...ich habe keine Ahnung warum der soviel Speicher frißt und wie ich das umgehen kann :-? Das einzige eas ich sehen konnte, je mehr Wörter in den Array geschrieben werde um so größer ist auch der Speicherzuwachs.

    Edit:Hab gerade mal den catchedwords.Add(Zeile); rausgenommen, dann bleibt der RAM gleich, liegt wohl an dem Hinzufügen der elemente ins Array :-?

    Vielen Dank
    Ray



  • Wie lang sind denn Deine Zeilen? Nehmen wir mal an, Deine 3,5MB-Datei besteht aus einer einzigen Zeile, dann wirst Du mit Deinem Speicherbedarf ziemlich nah an die 3,5MB rankommen. Wenn Deine Zeilen allerdings sehr kurz sind, als dementsprechend viele Zeilen, dann wird der Overhead durch Zusatzdaten, die das CStringArray und die einzelnen CString halten, sehr groß und daraus resultiert dann evtl. auch der hohe Speicherbedarf.



  • Hi Shaggy,

    das sind Wortlisten, also in der Tat besteht jede Zeile immer nur aus einem Word.

    Was meinst Du mit Overheat, bzw. was für Inforamtionen werden in CStrings/Arrays noch gespeichert außer den eigentlichen Elementen :-?

    Ich dachte statt ReadFile und dann gleich wieder WriteFile wäre es besser erst alles zu lesen und dann wieder auf einmal zu schreiben um die Lese und Schreibzugriffe zu beschleunigen. Aber wenn ich bei 3 MB schon so viel Speicher brauche denke ich ich werde das mit dem Array doch lieber lassen und halt wieder die Fesplatte "rattern" lassen 🙂

    Thx
    Ray



  • Overhead ist alles was, was zu den eigentlichen Daten zusätzlich gespeichert wird. Wenn Du z.B. eine Klasse hast, die eine nullterminierte Zeichenkette kapselt, dann gehört der Zeiger auf die Zeichenkette zum Overhead, meist wird noch die Länge gespeichert, die gehört dann auch zum Overhead, etc.

    Wenn Du also 3.500.000 Bytes hast und jede Zeile aus z.B. durchschnittlich 10 Zeichen besteht, dann hast Du eben 350.000 Zeilen. Für jede Zeile muss ein Pointer (4 Bytes), meistens die Länge der Zeile (4 Bytes), ... gespeichert werden. Je nachdem, wie verschwenderisch das CStringArray und der CString mit dem Speicher sind, kann aus den 10 Bytes Rohdaten schnell mal 100 Bytes pro Zeile werde -> Und da sind 35MB. Zugegeben die Rechnung ist sehr simpel, aber ungefähr so wird's wohl sein. Ist Dein RAM denn so knapp bemessen? Normalerweise sollte es kein Problem sein, wenn eine Software 50MB oder mehr Speicher belegt.

    By the way, werden die Lese-/ Schreibzugriffe eh gepuffert, also im Prinzip kannst Du auch direkt Lesen und Schreiben. Es sei denn es wird dann wirklich quälend langsam. Du kannst ja auch erst mal in ein CMemoryFile (ich glaube, so etwas gibt es) schreiben und dann von dort wieder auf die Platte, da sollte sich der Speicherbedarf ebenfalls in Grenzen halten.



  • Re,

    also mein Ram ist eigentlich nicht knapp, aber ich will nicht wissen was das Teil dnn bei einer 10-20MB Wordlist frißt und ich weiß ja nicht wieivel Ram meine User dann alle haben 🙂

    Habe das Ding jetzt wieder so umgeschrieben daß er gleich alles mit WriteString wieder ausgibt ist genau gleich schnell.

    Thx
    ray


Anmelden zum Antworten