![]() |
AW: Arbeitsspeicher läuft über - wie leeren
Bei mehrdimensionalen Arrays must Du explizit jede Dimension freigeben
z.B
Delphi-Quellcode:
so ungefähr. Müsste selbst erst nachschauen. Steht aber in der DH so drin und im Forum findest Du bestimmt auch Hinweise!:coder2:
For i:=0 to hight(meinarray[0],[0]) do
begin setlength(meinarray[0],[i], 0); end Somit würdest Du nur die 2. Dimension freigeben und der rest bleibt bestehen. Aber ändert nix daran, das Du trotzdem irgend wann, spätestens wenn Du Dein Programm beendest, alles freigeben musst!! Also jede Dimension! Gruss alfold |
AW: Arbeitsspeicher läuft über - wie leeren
Das probiere ich mal aus.
Wenn ich mein Programm beende, dann wird der ganze Speicher wieder freigegeben, wie ich im Taskmanager verfolgen kann.... Gruß Patrick |
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
Gruss alfold |
AW: Arbeitsspeicher läuft über - wie leeren
Moin,
Zitat:
![]() Ich wäre mir da nicht sicher. Oder habe ich da was übersehen? MfG Fabian |
AW: Arbeitsspeicher läuft über - wie leeren
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:
Könnt Ihr mir hlefen?
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; Danke Patrick |
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
@Ykcim, mach mal nach
Delphi-Quellcode:
Gruss alfold
Function......
var ..... begin SetLength(Cols, 0); ..... ..... if Assigned(MySQLRes) then begin // zurückgelieferte Anzahl der Spalten ColCount := mysql_num_fields(MySQLRes); SetLength(Cols, ColCount); SetLength(Rows, ColCount, 0); |
AW: Arbeitsspeicher läuft über - wie leeren
Warum ist den das hier Auskommentiert?
Delphi-Quellcode:
Da wird doch der Speicher wieder freigegeben!
// gespeicherte Abfrage wieder freigeben
{mysql_free_result(MySQLRes);} //←Das da |
AW: Arbeitsspeicher läuft über - wie leeren
Leider keinerlei Veränderungen. Habe es mit dem Taschenrechner bei mehrfacher Wiederholung getstet. Immer das gleiche Muster... seufz
|
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
Aber nochmal zum Code von Ykcim von der ersten oder zweiten Seite. Wie viele Zeilen hat die Prozedur? Tausend? Da blickt doch kein Schwein mehr durch. Zerleg das ganze mal in kleinere, übersichtliche Prozeduren. Dann siehst du wahrscheinlich auch, wo du unnötig und doppelt Speicher reservierst. |
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
MfG Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz