Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C# Funktion gibt Speicher nicht frei?

Empfohlene Antworten

Veröffentlicht

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.