AGB  ·  Datenschutz  ·  Impressum  







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

Memory leak durch funktion readln

Ein Thema von danieldelphi · begonnen am 12. Mär 2015 · letzter Beitrag vom 13. Mär 2015
Antwort Antwort
Seite 1 von 3  1 23      
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
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:24
Bei so großen Dateien würde ich direkt Delphi-Referenz durchsuchenTFileStream verwenden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
danieldelphi

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

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:31
Was wäre dabei der Vorteil?
Byteweise einlesen heißt, aber auch, dass ich nicht automatisch ganze zeilen einlesen kann oder doch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.279 Beiträge
 
Delphi 12 Athens
 
#4

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:33
byteweises Einlesen ist suboptimal (langsamer und resoursenlastiger)


Text ist wie "file of string" oder "file of char" und gibt es schon seit Turbo Pascal
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:40
Was wäre dabei der Vorteil?
Byteweise einlesen heißt, aber auch, dass ich nicht automatisch ganze zeilen einlesen kann oder doch?
Performance...

Gerade bei 2GB große Files...

Wobei Du natürlich NICHT "Byteweise" lesen solltest sondern:

Sondern eher eine Lesepuffer von 16MB oder größer nehmen...

Und dann die 16MB direkt in einem Rutsch mit einen Blockread lesen...

In Memory dann mit einem Zeiger durchlaufen und entsprechend per Blockwrite wegschreiben...
NIX ist schneller auch nicht der FileStream...
Der nutz nämlich genau die gleichen Routinen intern wie der Blockread... Nur mit mehr Overhead!

Mavarik
  Mit Zitat antworten Zitat
danieldelphi

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

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:43
Was wäre dabei der Vorteil?
Byteweise einlesen heißt, aber auch, dass ich nicht automatisch ganze zeilen einlesen kann oder doch?
Performance...

Gerade bei 2GB große Files...

Wobei Du natürlich NICHT "Byteweise" lesen solltest sondern:

Sondern eher eine Lesepuffer von 16MB oder größer nehmen...

Und dann die 16MB direkt in einem Rutsch mit einen Blockread lesen...

In Memory dann mit einem Zeiger durchlaufen und entsprechend per Blockwrite wegschreiben...
NIX ist schneller auch nicht der FileStream...
Der nutz nämlich genau die gleichen Routinen intern wie der Blockread... Nur mit mehr Overhead!

Mavarik
okay also du sagst 16 mb blockweise einlesen und damit dann weiter arbeiten?
kann man da denn noch gut nahc zeilen unterscheiden? ich gehe mal davon aus, dass es schwierig sein wird 16 mb auszulesen ohne dabei eine zeile zu zerschneiden, denn meine zeilen stellen zusammenhängede datensätze dar:/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.279 Beiträge
 
Delphi 12 Athens
 
#7

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:27
Wieso ist "Zeile" nicht lokal deklatiert?

Und ja, Text-Reads gehen immer über einen Puffer.
* dort wird der Inhalt stückchenweise reinkopiert
* da drin wird dann nach dem nächsten Zeilenumbruch gesucht (bzw nach dem Ende der für die Leseoperation ... z.B. das Ende der Zahl für Read(Datei, MyInteger) )
* und dann wird dort das zu Lesende rauskopiert, nachdem man weiß, bis wohin gelesen werden muß


PS: Auch das Writeln geht erstmal in diesen Cache.
Delphi-Quellcode:
PTextBuf = ^TTextBuf;
TTextBuf = array[0..127] of AnsiChar;
TTextRec = packed record
  Handle: THandle;
  Mode: Word;
  ...
  Name: array[0..259] of WideChar;
  Buffer: TTextBuf; // der Standardpuffer direkt in der "TEXT"-Variable
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (12. Mär 2015 um 10:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:32
Delphi-Quellcode:
procedure sterb_schleife;
var
  quell_dat, grossdatei: text; // ??????? C++

    flush(quell_dat); // ??????

end;
hmm Welche Delphi Version soll das den sein?
Flush auf die Quelle?

Also ich denke nicht das ein ReadLn/Writeln ein MemoryLeak produziert.

Bist Du sicher, dass Du uns "genug" Sourcecode gepostet hast?

Mavarik
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.115 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:33
Code der zumindest compiliert wäre sicher extrem hilfreich.
  Mit Zitat antworten Zitat
danieldelphi

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

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:39
Code der zumindest compiliert wäre sicher extrem hilfreich.
ich verstehe nicht ganz? wie meinst du das?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:59 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