Ich habe ein struct
, das so aussieht:
Ich habe eine std::vector< queue_item_t >
, die mit vielen von diesen aus einer Datenbankabfrage gefüllt ist.
Wenn jedes Element verarbeitet wird, wird eine Datei von der Festplatte gelesen und ihr Inhalt in das content
-String-Member eingefügt. Das Objekt wird verarbeitet ( content
wird analysiert) und ich führe .clear()
auf dem String aus, um nicht all meinen Speicher zu verbrauchen.
Dies scheint jedoch nicht die Erinnerung zu befreien. Ich habe Hunderttausende von Artikeln verarbeitet und schließlich wird die Speicherauslastung über das hinausgehen, was verfügbar ist, und die Anwendung wird von Linux mit "Out-of-Memory" als Grund getötet.
Wie kann ich den von diesen Strings verwendeten Speicher freigeben?
std :: string und std :: vector ändern nicht die Containerkapazität (= & gt; geben Sie keinen Containerspeicher frei) in clear (). Der folgende Trick mit temporärem Objekt sollte verwendet werden, wenn eine Komprimierung erforderlich ist (normalerweise ist dies nicht erforderlich).
%Vor%obigen Code kann einfacher gemacht werden, wenn Reinigung + Verdichtung erforderlich sind:
%Vor%Einige String-Implementierungen sind Copy-on-Write. Eine solche Zeichenfolge würde, wenn sie von mehr als einer Stelle aus aufgerufen wird, den Speicher beim Schreiben neu zuweisen.
clear
befreit nicht all den Speicher der Zeichenfolge (wahrscheinlich nur der Puffer). Es wird nur die Zeichenfolge auf eine leere setzen.
Wenn Sie in der Zeichenfolge clear
aufrufen können, warum nicht stattdessen verwenden? Anstatt also ein neues queue_item_t
zu erstellen, ersetzen Sie einfach das Zeichenfolgenelement durch den neuen Wert.
Um Speicher freizugeben, können Sie einfach Folgendes tun:
%Vor% Die Methode shrink_to_fit()
wird den Speicher freigeben und genügend Platz für den neuen Wert von my_queue_item.content
(15 Byte für diesen Fall) reservieren.
clear
darf den Speicher nicht freigeben. Es wird die Zeichenfolge logisch auf eine leere Zeichenfolge festlegen, aber den bereits zugewiesenen Speicher nicht beeinträchtigen.
Wenn Sie mehr Daten in dasselbe queue_item_t
lesen, sollte der vorherige Zeichenfolgeninhalt ersetzt werden.
Sind Sie sicher, dass Sie die queue_item_t
nicht selbst verlieren?