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

@Ronaldus

Wenn ich von dem Code ausgehe, wird hier von Firebird in eine Sybase DB geschrieben. Die Frage ist, ob das unterstützt wird.

Aber ich gebe Dir Recht, dass man vom dem SQL-Code mehr sehen muss.

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

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