AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeitsspeicher läuft über - wie leeren

Ein Thema von Ykcim · begonnen am 19. Aug 2010 · letzter Beitrag vom 20. Aug 2010
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Arbeitsspeicher läuft über - wie leeren

  Alt 19. Aug 2010, 13:30
Das hat den gleichen Effekt wie setlength(meinArray,0,0);

Ich habe auch noch festgestellt, dass die Häfigkeit, wie oft meine For-Schleifen mit dem setlength() durchlaufen werden keine Auswirkung auf den Speicherzuwachs hat.

Ich habe deshalb einfach mal die Hälfte meiner Datensätze, die ich in die Software einlese und dann nicht weiter benötige von meinem SQL-Server geschmissen.
Ich wollte damit testen, ob der Speicher bei meiner Procedure oder schon beim Einlesen der Daten, aus dem MySQL Server heraus, geblockt wird.

Obwohl das Ergebnis meiner Suchprocedure das gleiche ist, also die setlength() Befehle genauso oft aufgerufen werden wie vorher, ist das Speicherleck auf 150kbyte runter.

Das führt mich wieder zu meiner Annahme, dass ich aus irgendeinem Grund meine Arrays nicht geleert bekomme.

Diese Annahme wird weiter gestützt durch die Tatsache, dass ich auch bei anderen Proceduren Speicherlecks habe, wo Daten quasi nur von dem MySQL Server geholt und ausgegeben werden...

Nachfolgend die Funktion, die ich für den Datentransfer nutze...

Delphi-Quellcode:
function ExecQuery(const Datenbank, query: string; var Cols: TCols; var Rows: TRows): Boolean;
var
   i: Integer;
   j: Integer;
   Startzeit1, Startzeit2, Endzeit1, Endzeit2 : cardinal;
begin
   // Datenbank auswählen
   ErrorCode := mysql_select_db(_mycon, PChar(Datenbank));
   if ErrorCode = 0 then
   begin
     // Query ausführen
     ErrorCode := mysql_real_query(_mycon, PChar(query), length(query));
     if ErrorCode <> 0 then
     begin
       ShowMessage(mysql_error(_myCon));
       Exit;
     end
     else
     begin
       // Query speichern
       MySQLRes := mysql_store_result(_mycon);
       if Assigned(MySQLRes) then
       begin
         // zurückgelieferte Anzahl der Spalten
         ColCount := mysql_num_fields(MySQLRes);
         SetLength(Cols, ColCount);
         // Spalten-Array füllen
         for i := 0 to ColCount - 1 do
         begin
           Field := mysql_fetch_field_direct(MySQLRes, i);
           Cols[i] := Field.Name;
         end;
         // Anzahl der betroffenen Zeilen ermitteln
         AffectedRows := mysql_affected_rows(_mycon);
         SetLength(Rows, ColCount, AffectedRows);
         // neu ->
         // Zeilen-array füllen
         // alle Zeilen ...
         for j := 0 to AffectedRows - 1 do
         begin
           // ... werden eingelesen
           MySQLRow := mysql_fetch_row(MySQLRes);
           // alle Spalten ...
           for i := 0 to ColCount - 1 do
           begin
             // ... werden in Rows[] übertragen
             Rows[i, j] := MySQLRow[i];

           end;
         end;
         // gespeicherte Abfrage wieder freigeben
         {mysql_free_result(MySQLRes);}
       end
     end
   end;
   result := ErrorCode = 0;
end;
Könnt Ihr mir hlefen?

Danke
Patrick
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz