Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Memory leak durch funktion readln (https://www.delphipraxis.net/184250-memory-leak-durch-funktion-readln.html)

danieldelphi 12. Mär 2015 10:40

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von Union (Beitrag 1293143)
Wann wird die Stringliste meldung geleert?

die wird gar nicht geleert, bzw beim beenden des programms, aber da kommen nur ein paar zeilen rein, die auf dem form angezeigt werden

Mavarik 12. Mär 2015 10:40

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von danieldelphi (Beitrag 1293138)
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... :stupid:
Der nutz nämlich genau die gleichen Routinen intern wie der Blockread... Nur mit mehr Overhead!

Mavarik

danieldelphi 12. Mär 2015 10:43

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von Mavarik (Beitrag 1293146)
Zitat:

Zitat von danieldelphi (Beitrag 1293138)
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... :stupid:
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:/

mm1256 12. Mär 2015 10:44

AW: Memory leak durch funktion readln
 
Speichermäßig ist das doch am einfachsten mit zeilenweiser String-Bearbeitung, oder?

Delphi-Quellcode:
procedure Die_Schleife_Stirbt_Nicht(Von,Nach: string);
var
  T1, T2: TextFile;
  Zeile: string;
begin
  AssignFile(T1,Von); // bzw. Assign(T1,Von); in D6
  Reset(t1);
  AssignFile(T2,Nach);
  Rewrite(T2);
  while not EOF(T1) do begin
    ReadLn(T1,Zeile);
    // Zeileninhalt bearbeiten
    WriteLn(T2,Zeile);
  end;
  CloseFile(T1); // bzw. Close(T1) in D6
  CloseFile(T2);
end;

danieldelphi 12. Mär 2015 10:47

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von mm1256 (Beitrag 1293148)
Speichermäßig ist das doch am einfachsten mit zeilenweiser String-Bearbeitung, oder?

Delphi-Quellcode:
procedure Die_Schleife_Stirbt_Nicht(Von,Nach: string);
var
  T1, T2: TextFile;
  Zeile: string;
begin
  AssignFile(T1,Von); // bzw. Assign(T1,Von); in D6
  Reset(t1);
  AssignFile(T2,Nach);
  Rewrite(T2);
  while not EOF(T1) do begin
    ReadLn(T1,Zeile);
    // Zeileninhalt bearbeiten
    WriteLn(T2,Zeile);
  end;
  CloseFile(T1); // bzw. Close(T1) in D6
  CloseFile(T2);
end;

gebnau das ist ja der ausgangspunkt, so ist am ende der arbeitsspeicher mit der einzulesesnden datei gefüllt.

Mavarik 12. Mär 2015 10:47

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von danieldelphi (Beitrag 1293142)
das ist delphi 6.

hmm cool

Unter Delphi 6 ist ein String immer ein Shortstring... Oder verwechsele ich da gerade etwas? Ist zu lange her...

Bist Du sicher, das Deine Zeilen in den Textdateien kürzer als 255 Zeichen sind?

Mavarik

DeddyH 12. Mär 2015 10:49

AW: Memory leak durch funktion readln
 
Du bist anscheinend bei Delphi 1 stehengeblieben, in Delphi 2 bis 2007 ist ein String ein AnsiString.

danieldelphi 12. Mär 2015 10:49

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von Mavarik (Beitrag 1293150)
Zitat:

Zitat von danieldelphi (Beitrag 1293142)
das ist delphi 6.

hmm cool

Unter Delphi 6 ist ein String immer ein Shortstring... Oder verwechsele ich da gerade etwas? Ist zu lange her...

Bist Du sicher, das Deine Zeilen in den Textdateien kürzer als 255 Zeichen sind?

Mavarik

ich bin mir nicht sicher, bzw ich weiß, dass die zeieln teilweise über 300 zeichen haben, aber zeile ist bei mir auch ein char array mit 500 zeichen den ich dann in der procedure in einen string umwandel, siehst du da ein problem dass ich nicht sehe?

Mavarik 12. Mär 2015 10:50

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von deddyh (Beitrag 1293152)
du bist anscheinend bei delphi 1 stehengeblieben, in delphi 2 bis 2007 ist ein string ein ansistring.

ok ok...

mm1256 12. Mär 2015 10:53

AW: Memory leak durch funktion readln
 
Zitat:

Zitat von danieldelphi (Beitrag 1293149)
gebnau das ist ja der ausgangspunkt, so ist am ende der arbeitsspeicher mit der einzulesesnden datei gefüllt.

Aber genauso mach ich das schon jahrelang mit großen Textdateien ohne Probleme. Schau dir deinen Code genauer an, da musst du ein Problem haben.

Was soll z.B. das...wenn angenommen "Zeile" eine Stringvariable ist:

Delphi-Quellcode:
//BG2010: Wenn Zeile mit Hochkomma beginnt, dann Einlesevorgang abbrechen...
      if zeile[0] = '''' then break;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Seite 2 von 7     12 34     Letzte »    

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