Zum Inhalt springen

C# Funktion gibt Speicher nicht frei?


Empfohlene Beiträge

Geschrieben

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?!

Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...