Zum Inhalt springen

C# Funktion gibt Speicher nicht frei?


TDM

Empfohlene Beiträge

Tag,

ich greife mit einer Funktion auf Datensätze innerhalb einer Tabelle zu und möchte Fremdschlüssel aktualisieren (da es beim Einfügen der DS momentan fehler entstehen und er falsche Werte integriert).

Tabelle A ist meine Haupttabelle, welche auf Tabelle B verweist.

Außerdem gibt es für jeden Typ in Tabelle A noch einen Haupttyp, welche in Tabelle C stehen.

Tabelle B verweißt auch auf Tabelle C.

Damit nun die richtige ID zu B in A steht, hab ich eine Funktion geschrieben, die erst alle Haupttypen (Tabelle C) iteriert und dann B durchläuft.

Danach schaut er in A, und sucht den Typ mit der jeweiligen Beschreibung von B, folglich wird dann A der richtige FK zugewiesen.

Soweit funktioniert das Ganze auch wie es soll, nur wird nach beenden der Funktion der Speicher nicht freigegeben und bei der Anzahl der Datensätze beläuft sich das mitunter auf 500 MB (!!!).

Hier mal der Code:


public int updateRange()

        {

            int ret = 0;

            DbReader reader = new DbReader("C:\\test.mdb", "");

            DataTable dtMT = reader.readDataSet("SELECT NAME FROM HitMainTypes").Tables[0];

            DataTable dtLR = reader.readDataSet("SELECT NAME FROM LoadRanges").Tables[0];


            string[] aMTs = new string[dtMT.Rows.Count];

            string[] aLRs = new string[dtLR.Rows.Count];


            for (int i = 0; i < dtMT.Rows.Count; i++)

            {

                aMTs[i] = (string)dtMT.Rows[i]["Name"];

            }


            for (int i = 0; i < dtLR.Rows.Count; i++)

            {

                aLRs[i] = (string)dtLR.Rows[i]["Name"];

            }


            for (int i = 0; i < dtMT.Rows.Count; i++)

            {

                for (int j = 0; j < dtLR.Rows.Count; j++)

                {

                    int mtId = reader.readID("HitMainTypes", "Name=\'" + aMTs[i] + "\'");

                    Console.WriteLine("ID.{0}={1}", aMTs[i], mtId);

                    //Assert.AreNotEqual(0, mtId, "updateRange.MT");


                    int lrId = reader.readID("LoadRanges", "(Name=\'" + aLRs[j] + "\') AND HitMainTypeID = " + mtId + "");

                    Console.WriteLine("ID.{0}={1}", aLRs[j], lrId);

                    if(lrId != 0 && mtId != 0)

                    {

                        int testerle =      reader.readDataSet(

                                                    "SELECT LoadCarryingCapacity.ID" +

                                                    " FROM LoadCarryingCapacity INNER JOIN LoadRanges ON LoadCarryingCapacity.LoadRangeID = LoadRanges.ID" +

                                                    " WHERE (LoadRanges.Name = \'" + aLRs[j] + "\') AND (LoadCarryingCapacity.HitMainTypeID = " + mtId + ")").Tables.Count;

                        DataTable dtUpdateId =  reader.readDataSet(

                                                    "SELECT LoadCarryingCapacity.ID" + 

                                                    " FROM LoadCarryingCapacity INNER JOIN LoadRanges ON LoadCarryingCapacity.LoadRangeID = LoadRanges.ID" +

                                                    " WHERE (LoadRanges.Name = \'" + aLRs[j] + "\') AND (LoadCarryingCapacity.HitMainTypeID = " + mtId + ")").Tables[0];

                        int[] aUIDs = new int[dtUpdateId.Rows.Count];


                        for (int k = 0; k < dtUpdateId.Rows.Count; k++)

                        {

                            aUIDs[k] = (int)dtUpdateId.Rows[k]["ID"];

                        }


                        string where = "";


                        for (int k = 0; k < dtUpdateId.Rows.Count; k++)

                        {

                            where += "(ID = " + aUIDs[k] + ")";

                            if (k + 1 < dtUpdateId.Rows.Count)

                                where += " OR ";

                        }

                        string sql =        "UPDATE LoadCarryingCapacity" +

                                            " SET LoadRangeID = " + lrId +

                                            " WHERE " + where;


                        ret += reader.execute(sql);

                    }

                }

            }

            return ret;

        }

Wieso benötigt er auch nach der Funktion (ja, sogar nach dem Schließen des Programms) immernoch so viel Speicher?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi.

Das mit dem schließen des Programms kann ich nicht nachvollziehen, wird der Prozess nicht beendet? Das nach dem Aufruf noch soviel Speicher belegt wird ist normales GarbageCollector Verhalten. Sobald der Speicher vom OS oder von deiner Applikation benötigt werden sollte wird er automatisch freigegeben, ansonsten bleibt er eben solange belegt und frisst ja kein Brot.

Wenn du ein

GC.Collect();

GC.WaitForPendingFinalizers();

nach beenden der Methode aufrufst wird der Speicher evtl. sofort freigegeben. Allerdings sollte man das nicht machen. Generell funktioniert das System ganz gut, solange du keine Probleme damit hast würde ich mir auch keine Sorgen darum machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...