Hallo,
kurze Frage zu shrink_to_fit
https://en.cppreference.com/w/cpp/container/vector/shrink_to_fit
Kann es sein, dass shrink_to_fit kurzfristig einen erheblichen Speicherverbrauch verursacht und so zum Risiko wird bei vectoren die viel vom RAM belegen?
Anwendung:
Mit emplace_back() nach und nach vector füllen bis unveränderbarer Zustand erreicht wird. Danach rufe ich shrink_to_fit auf.
Manchmal wird ein vector neu befüllt dann clear(). Danach rufe ich auch shrink_to_fit auf.
Da das Programm immer wieder abgeschmiert ist, habe ich mal den RAM Verlauf vom OS betrachtet und gesehen, dass es extreme Sprünge in der Speicherauslastung gibt die aber nur als ganz kurzer Sprung auftreten. Meine Vermutung wenn der RAM zu 80% ausgelastet ist durch stark befüllte vectoren ist dies vermutlich der Grund für den Absturz weil dann in dieser Sekunde der verfügbare RAM nicht mehr ausreicht.
Ich habe shrink_to_fit auskommentiert und scheinbar ist das Problem weg. Offenbar steckt hinter dem shrink_to_fit irgendwie ein swap mit sich selbst ist das korrekt? Wird dabei ggf dann kurzfristig der vector komplett kopiert also verdoppelt sich dessen Speicherauslastung? Das würde auf jeden Fall die Sache erklären.
Man sagt clear() erase() gibt den Speicher nicht unbedingt frei.
Aber auch nach einer Reihe emplace_back() oder push_back() soll mehr Speicher reserviert werden als immer nötig.
Daher galt für mich shrink_to_fit immer als Standartzeile nach großen Befüllungen oder nach dem löschen. Bisher konnte ich aber nicht feststellen, dass merklich zuviel Speicher verbraucht wird ohne shrink_to_fit.
Kann es sein, dass shrink_to_fit in Wirklichkeit eher kontraproduktiv ist und man sich wie oben eher das Risiko eines Crashs ins Boot holt?
kurze Frage zu shrink_to_fit
https://en.cppreference.com/w/cpp/container/vector/shrink_to_fit
Kann es sein, dass shrink_to_fit kurzfristig einen erheblichen Speicherverbrauch verursacht und so zum Risiko wird bei vectoren die viel vom RAM belegen?
Anwendung:
Mit emplace_back() nach und nach vector füllen bis unveränderbarer Zustand erreicht wird. Danach rufe ich shrink_to_fit auf.
Manchmal wird ein vector neu befüllt dann clear(). Danach rufe ich auch shrink_to_fit auf.
Da das Programm immer wieder abgeschmiert ist, habe ich mal den RAM Verlauf vom OS betrachtet und gesehen, dass es extreme Sprünge in der Speicherauslastung gibt die aber nur als ganz kurzer Sprung auftreten. Meine Vermutung wenn der RAM zu 80% ausgelastet ist durch stark befüllte vectoren ist dies vermutlich der Grund für den Absturz weil dann in dieser Sekunde der verfügbare RAM nicht mehr ausreicht.
Ich habe shrink_to_fit auskommentiert und scheinbar ist das Problem weg. Offenbar steckt hinter dem shrink_to_fit irgendwie ein swap mit sich selbst ist das korrekt? Wird dabei ggf dann kurzfristig der vector komplett kopiert also verdoppelt sich dessen Speicherauslastung? Das würde auf jeden Fall die Sache erklären.
Man sagt clear() erase() gibt den Speicher nicht unbedingt frei.
Aber auch nach einer Reihe emplace_back() oder push_back() soll mehr Speicher reserviert werden als immer nötig.
Daher galt für mich shrink_to_fit immer als Standartzeile nach großen Befüllungen oder nach dem löschen. Bisher konnte ich aber nicht feststellen, dass merklich zuviel Speicher verbraucht wird ohne shrink_to_fit.
Kann es sein, dass shrink_to_fit in Wirklichkeit eher kontraproduktiv ist und man sich wie oben eher das Risiko eines Crashs ins Boot holt?