4 Stimmen

Rekursion führt zu Speicherüberlauf

Ich habe einen RAM von 2 GB. Wir haben eine Anwendung, die Export- / Importoperationen durchführt. Wir haben eine rekursive Funktion, die eine lokale Variable vom Typ Set hat, die bei jeder Iteration kontinuierlich gefüllt wird. Dieses Set wächst ständig und irgendwann haben wir keinen Speicher mehr.

Gibt es eine alternative Datenstruktur, die den Speicher optimal nutzen kann?

Hier ist der grobe Code

GetObjectsForExportImpl(long lExportOptions, __int64 numIdProject, XExportSets
     &exportSets, long lClientId, CComPtr ptrIPDServer,FILE *fp)
{
    XExportSets exportLocal;   //Das ist eine Struktur, die das Set enthält
    QueryObjectsForExport(lExportOptions, numIdProject, exportLocal,
         lClientId, ptrIPDServer);
    SetIDs::iterator it = exportLocal.setShared.begin();

    for (; it != exportLocal.setShared.end(); ++it)
    {
         //rekursiver Aufruf
         pExportObject->GetObjectsForExportImpl(lExportOptions,
             numIdProject, exportSets, lClientId, ptrIPDServer,fp);
    }
}

0voto

slim Punkte 37932

Ich glaube nicht, dass die Rekursion viel mit deinem Problem zu tun hat. Das Problem ist nur, dass die Daten, die du erstellst, groß sind. Die Umstellung auf eine iterative Lösung wird das nicht verbessern. Wie bereits erwähnt wurde, solltest du die Ausgabe beim Durchlaufen schreiben, anstatt sie in einer In-Memory-Struktur zu speichern.

Du kannst jedoch minimieren, was auf dem Stack passiert, indem du Zeiger in deinen rekursiven Aufrufen übergibst, anstatt ganze Strukturen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X