Zum Inhalt springen

Arbeitsspeicher Problem mit Endlosschleife


Empfohlene Beiträge

Geschrieben

Hallo Gemeinde,

ich schreibe derzeit eine Konsolenanwendung, die Daten von einer Datenbank zur anderen karrt.

Das passiert in einer Schleife, leider wird der Arbeitsspeicherverbrauch immer höher, also gehe ich davon das die Objekte aus den älteren Durchgängen noch irgendwie gespeichert bleiben.


 static void Main(string[] args)

    {

      Console.SetWindowSize(Console.WindowWidth, Console.WindowHeight);


      Konfiguration lKonfig = new Konfiguration();

      lKonfig.ShowDialog();

      int liTimeout = 2000;


      if (lKonfig.DialogResult == System.Windows.Forms.DialogResult.OK)

      {

        liTimeout = lKonfig.Timeout * 1000;


        while (Run)

        {

          try

          {

            Sql lSql = new Sql(lKonfig.ConnectionStringFirebird, lKonfig.ConnectionStringSybase);


            Log.Info("Transfer wird gestartet", ConsoleColor.White);

            bool lbAenderung = lSql.AverpZuIcline();


            if (lbAenderung)

              Log.Info("avERP zu ICLine Transfer erfolgreich beendet. Details zu den Änderungen entnehmen Sie bitte dem Log", ConsoleColor.Green);

            else

              Log.Info("avERP zu ICLine Transfer erfolgreich beendet. Es gab keine Änderungen", ConsoleColor.Green);


            lbAenderung = lSql.IclineZuAverp();

          }

          catch (Exception e)

          {

            Log.Fehler(e.Message.ToString());

          }


          Thread.Sleep(liTimeout);

        }

      }

    }

Ich bin extra dazu übergegangen, das SQL Objekt jeden Durchlauf neu zu erstellen, aber das hat leider auch nichts gebracht. Auch GC.Collect() am Ende der Schleife hilft nicht.

Das Programm läuft so lange bis der Arbeitsspeicher voll ist und schießt sich dann mit einer OutOfMemoryException ab.

Hat jemand einen Tipp was man ändern sollte?

Wenn ihr noch weitere Infos etc braucht, stell ich euch die gerne zur Verfügung

Geschrieben (bearbeitet)

Sehr ungewöhnlich die Mischung zwischen Console und WinForms, aber egal.

Zuerst würde ich das Herstellen der Connection(s) aus der Scheife herausnehmen.

Dann noch eine Frage: Was soll "Thread.Sleep()" für eine Funktion haben?

EDIT: Achso, die Klasse SQL macht hier wohl alles? Verbindung aufbauen, Command absetzen und Verbinding trennen?

EDIT2: Ist es möglich, die Insert Commands zur Zieldatenbank im Programm zu erstellen und alle auf einmal ausführen zu lassen?

Bearbeitet von lbm1305AtWork
Geschrieben

Hi,

Beim Kopieren oder Einfügen großer Datenmangen nutze ich gern BulkInsert....Den Code der SQL-Klasse solltest du zur Analyse hier zugänglich machen, sonst kann man nicht viel erkennen...

Gruß Ronaldus

Geschrieben

Servus !

1. Methoden des Garbage-Collector kannst Du ja auch nur nutzen, wenn Du die Objekte mit gcnew instanziierst.

2. Auf jeden Fall mal Sql lSql = new Sql(lKonfig.ConnectionStringFirebird, lKonfig.ConnectionStringSybase); aus der Schleifer herausnehmen.

3. Was meint denn der Debugger ?

4. Wo ist die Variable Run deklariert + initialisiert?

5. ...

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