Einzelnen Beitrag anzeigen

danieldelphi

Registriert seit: 12. Mär 2015
38 Beiträge
 
#1

Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:20
Hallo zusammen,

ich hab mich grade erst hier angemeldet, und das ist auch das erste mal dass ich mich in einem delphi forum anmelde, also wenn ich mich nicht an irgendwelche reglen halte, die ihr hier einhaltet, dann nur weil ich es nicht besser weiß, also schonmal sorry im voruas

Hier mein Problem:
Ich führe eine Projektzusammenführung durch, hat alles ganz gut geklappt, bis ich auf ein erhebliches memory leak gestoßen bin, das mit der fehlermeldung out of memory geendet hat,
mit Hilfe von FastMM konnte ich einen Leck finden, sodass mein Code jetzt läuft ohne abzuschmieren, aber der Arbeitsspeicher wird dennoch stetig mit zunehmender Zeit gekillt.
Dann hab ich weiter gesucht und iwo gelesen, dass FastMM keine leaks bezüglich externer Datein findet, dann hab ich mir genauer angeguckt ob das bei mir zutrifft, und es hat gepasst.

Ich lese eine Datei mit readln ein und schreibe später die umgewandelten Daten in eine andere Datei. Ich hab den Code mal auf das Grundproblem reduziert:
Delphi-Quellcode:
procedure sterb_schleife;
var
  quell_dat, grossdatei: text;



begin

  assign(grossdatei, pfad_aus + gesell + 'big.txt');
  rewrite(grossdatei);
    quell_dat_name := 'test.TXT';
    assign(quell_dat, pfad_ein + gesell + '\' + quell_dat_name);
    reset(quell_dat);

    while not eof(quell_dat){zaehler_gesamt<1200000} do
    begin
        readln(quell_dat, zeile);


       Writeln(grossdatei, zeile);
          ////////////////////////////////

        inc(zaehler_gesamt);
        if ((zaehler_gesamt mod 1000) = 0) then
          dsnr.strings[1] := inttostr(zaehler_gesamt);

    end;

    flush(quell_dat);
    close(quell_dat);


  flush(grossdatei);
  close(grossdatei);

end;
Ich beobachte das gnaze mit dem Ressource Monitor von Windows.
Das readln sollte doch eigentlich nur eine Zeile einlesen, aber scheinbar ließt es eine zeile und hält sie im speicher und dann die nächste, usw., da kann ich ja direkt mit der tstringlist und loadfromfile arbeiten, das Problem bei der Sache ist, dass meine text dateien bis zu 2 gb groß sein können.. Ich und sogar mein Chef wir sind ratlos. Habtz ihr eine alternative Idee, oder seht ihr den groben Denkfehler? Ich habe schon gelesen, dass man die Output datei hin und wieder schliießen und neu öffnen soll, hat aber auch nix gebracht.
Und jetzt kommt der Brüller, in meinen großen Programm tritt der Fehler mal auf und mal nicht, ich kann ihn nicht wirklich reproduzieren...

Es wäre echt mehr als coolm, wenn ihr mir iwie weiter helfen könntet, denn sosnt sthet mein Projekt leider vor dem aus(
Ich überlege sogar das Projekt in Java umzuschreiben, weil ich eigentlich ein großer Fan vom Garbage collector bin, aber performancemäßig rät mir mein chef davon ab...

DAaaaaaaaanke und viele Größe
Daniel
  Mit Zitat antworten Zitat