Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist, THashedStringlist gibts nichts schnelleres?? (https://www.delphipraxis.net/149517-tstringlist-thashedstringlist-gibts-nichts-schnelleres.html)

Muetze1 23. Mär 2010 15:33

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Es ist ein Wunder, dass er nur so lange braucht. Der Code ist mehr als unperformant und zudem auch sehr unsicher.

1. Zuweisen und Lesen von der Eigenschaft .Text baut den String jedesmal erneut auf bzw. parst ihn neu.
2. try/finally fehlt komplett
3. .RowCount in einer Schleife in einzelnen Schritten zu erhöhen bzw. zu verringern kostet viel Zeit.
4. Du setzt einen neuen Wert bei der Progressbar und zwingst ihn sofort neu zu zeichnen. Somit wird das Zeichnen der Progressbar mit jedem Durchlauf innerhalb der Schleife getan und kostet somit noch mehr Zeit.

Grundlegend: Trenne Daten von der Oberfläche!

Franzelchen 23. Mär 2010 15:50

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Bitte wie?? was?

Zitat:

Zitat von Muetze1
Es ist ein Wunder, dass er nur so lange braucht. Der Code ist mehr als unperformant und zudem auch sehr unsicher.

1. Zuweisen und Lesen von der Eigenschaft .Text baut den String jedesmal erneut auf bzw. parst ihn neu.
2. try/finally fehlt komplett
3. .RowCount in einer Schleife in einzelnen Schritten zu erhöhen bzw. zu verringern kostet viel Zeit.
4. Du setzt einen neuen Wert bei der Progressbar und zwingst ihn sofort neu zu zeichnen. Somit wird das Zeichnen der Progressbar mit jedem Durchlauf innerhalb der Schleife getan und kostet somit noch mehr Zeit.

Grundlegend: Trenne Daten von der Oberfläche!

Ich bin froh und glücklich das dieser Text funktioniert und viel zu sehr Anfänger um Deine Analyse zu bezweifeln. Und wie bekomme ich das nun schneller (zB. Eigenschaft .Text) und was meinst du mit unsicher?? Deine ganze Analyse -> Frage über Frage ?

stoxx 23. Mär 2010 15:58

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
@ Muetze1 .. nein, er schrieb ja, dass es ab der Stringgrid langsam wird, das zuweisen ist alles noch fix.

also das Problem ist, dass Du den gesamten Text in die Stringgrid kopierst. Das schafft die nicht wirklich. Dafür ist sie nicht gedacht.
Was Du brauchst ist eine "virtuelle" Stringgrid.
Du musst im Ereignis OnDrawCell den Text mit Canvas.Textout selbst zeichnen.
Und immer nur den bereich, der auf dem Bildschirm zu sehen ist. die Stringlist fungiert nur als Hintergrundspeicher.
Dann gehts auch fix ...
Für riesige Files, die größer sind als Dein Hauptspeicher, brauchst Du das File noch nichtmal in den Hauptspeicher laden.
Dann genügt es, wenn Du nur den aktuellen Bereich, der vom User gerade angezeigt werden möchte lädst und anzeigst.
Aber solche einfachen Dinge kann noch nicht mal Notepad .. Ultraedit macht das aber ...




Im Prinzip reicht für solche großen Textdateien dann auch eine TDrawGrid ...


P.S. für die Funktion StringReplace gibts in der JCL von Jedi eine schnellere Variante als die in der VCL

Franzelchen 23. Mär 2010 16:15

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Virtuelle Stringgrid?? langsam verstehe ich immer mehr Bahnhof.
StringReplace aus VCL --> Für das ersetzen von ca.200 ß(sz) in mehrere s sowie zurück ist die VCL doch noch schnell genug.

Sir Rufo 23. Mär 2010 16:20

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Er schreibt, dass das Befüllen des StringGrid sehr langsam ist ... und das glaube ich sogar :mrgreen:

1. StringGrid1.RowCount

Das ständige Erhöhen des Wertes stresst unnötig.
Setze am Anfang der Schleife den Wert und fertig

2. StringGrid1.Cells[ x, y ]

Benutze besser StringGrid1.Rows[ y ] und zwar so:
Delphi-Quellcode:
StringGrid1.Rows.BeginUpdate; // Anzeige der StringGrid.Reihen nicht mehr aktualisieren
for Zeile := 0 to StringGrid1.RowCount - 1 do
  begin
    Spalte := 1; // fängt bei 0 an, also ist es die 2. Spalte im StringGrid
    StringGrid1.Rows[ Zeile ][ Spalte ] := 'Tach auch';
  end;
StringGrid1.Rows.EndUpdate; // Anzeige der StringGrid.Reihen wieder aktualisieren
Denn sonst aktualisiert sich das Formular zu Tode

3. ProgressBar

Die ProgressBar braucht auch nicht jede Änderung mitzubekommen
Delphi-Quellcode:
MaxWert := 10000;
ProgressBar1.Max := MaxWert;
for i := 0 to MaxWert - 1 do
  begin
    if ( i mod 100 = 0 ) or ( i = MaxWert ) then
      ProgressBar1.Position := i;
  end;
Dann sollte das schon schneller laufen

stoxx 23. Mär 2010 16:24

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von Franzelchen
Virtuelle Stringgrid?? langsam verstehe ich immer mehr Bahnhof.
StringReplace aus VCL --> Für das ersetzen von ca.200 ß(sz) in mehrere s sowie zurück ist die VCL doch noch schnell genug.

ich muss mich ein klein wenig berichtigen, Du musst gar nicht OnCellDraw nehmen.
Es geht auch so, wie Du es gemacht hast, dann aber mit einer zweiten Scrollbar neben der Stringgrid, welche diese ersetzt.
Stringgrid.rowcount wird auf 30 oder so gesetzt.

virtuell bedeutet. Du hast ein File mit 1 Mio Textzeilen.
Beim Anzeigen siehst Du aber nur vielleict 30 Zeilen in der Stringgrid.
Die Stringgrid hat nie mehr als 30 Zeilen effektive Einträge. Beim Scrollen wird Dir nur vorgegaugelt, es wäre soviel drin. in Wahrheit wird die gewünschte Anzeige erst dann live hineingemalt.
Du schmeißt also nicht 1 Mio Zeilen in die Stringgrid, sondern immer nur 30 ...

stoxx 23. Mär 2010 16:26

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Benutze besser StringGrid1.Rows[ y ] und zwar so:

.. ich hatte bei der Stringgrid gerade vergeblich BeginUpdate gesucht, .. in den Rows hat sich das also versteckt.

ja .. das wäre eine Maßnahme die sehr helfen könnte :mrgreen:

Sir Rufo 23. Mär 2010 16:28

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von stoxx
Du schmeißt also nicht 1 Mio Zeilen in die Stringgrid, sondern immer nur 30 ...

es ist ja etwas andres (und vor allem besser)

Die Komponente fragt diese 30 Zeilen per Index ab und ich muss nur darauf reagieren und diese Informationen liefern.
Aber auch nur genau in diesem Moment.

Franzelchen 23. Mär 2010 16:34

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von stoxx

ich muss mich ein klein wenig berichtigen, Du musst gar nicht OnCellDraw nehmen.
Es geht auch so, wie Du es gemacht hast, dann aber mit einer zweiten Scrollbar neben der Stringgrid, welche diese ersetzt.
Stringgrid.rowcount wird auf 30 oder so gesetzt.

virtuell bedeutet. Du hast ein File mit 1 Mio Textzeilen.
Beim Anzeigen siehst Du aber nur vielleict 30 Zeilen in der Stringgrid.
Die Stringgrid hat nie mehr als 30 Zeilen effektive Einträge. Beim Scrollen wird Dir nur vorgegaugelt, es wäre soviel drin. in Wahrheit wird die gewünschte Anzeige erst dann live hineingemalt.
Du schmeißt also nicht 1 Mio Zeilen in die Stringgrid, sondern immer nur 30 ...

Theoretisch verstehe ich das. aber praktisch gleich gar nicht.

@ Sir Rufo
Also zwischen beginUpdate und endUpdate den QuellText setzen und damit die Stringgrid Aktualisierung aufheben.

Ich werde das ganze mal ausprobieren.

Franzelchen 24. Mär 2010 13:31

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von Sir Rufo
Er schreibt, dass das Befüllen des StringGrid sehr langsam ist ... und das glaube ich sogar :mrgreen:

1. StringGrid1.RowCount

Das ständige Erhöhen des Wertes stresst unnötig.
Setze am Anfang der Schleife den Wert und fertig

2. StringGrid1.Cells[ x, y ]

Benutze besser StringGrid1.Rows[ y ] und zwar so:
Delphi-Quellcode:
StringGrid1.Rows.BeginUpdate; // Anzeige der StringGrid.Reihen nicht mehr aktualisieren
for Zeile := 0 to StringGrid1.RowCount - 1 do
  begin
    Spalte := 1; // fängt bei 0 an, also ist es die 2. Spalte im StringGrid
    StringGrid1.Rows[ Zeile ][ Spalte ] := 'Tach auch';
  end;
StringGrid1.Rows.EndUpdate; // Anzeige der StringGrid.Reihen wieder aktualisieren
Denn sonst aktualisiert sich das Formular zu Tode

3. ProgressBar

Die ProgressBar braucht auch nicht jede Änderung mitzubekommen
Delphi-Quellcode:
MaxWert := 10000;
ProgressBar1.Max := MaxWert;
for i := 0 to MaxWert - 1 do
  begin
    if ( i mod 100 = 0 ) or ( i = MaxWert ) then
      ProgressBar1.Position := i;
  end;
Dann sollte das schon schneller laufen

So, jetzt hab ich's ausprobiert.
.beginUpdate sowie .endUpdate wird zwar von der Codevervollständigung unterstützt, der Compiler dagegen erwartet eine eckige Klammer und compiliert deshalb nicht.
Die Progressbar hab ich vorerst vollständig weggelassen so das mein Text jetzt so aussieht:

Delphi-Quellcode:
begin
Screen.Cursor := crHourGlass;
startZeit := now;
  x:=tstringlist.Create;
  x.LoadFromFile('C:\DB\DatenTest.tmp');

  x.Text:= StringReplace(x.Text,'ß','SSSSSSS', [rfReplaceAll]);
  x.Sort;
  x.Text:= StringReplace(x.Text,'SSSSSSS','ß',[rfReplaceAll]);

  x.SaveToFile('sortiert.txt');


// ab hier wird es extrem langsam

  a:=0;
 
// stringgrid1.rows.beginupdate;  //fehlermeldung: [ erwartet
//   try
  for b:=0 to x.count-1 do
  begin
      if b>0 then begin
       if x.strings[b]=x.Strings[b-1] then begin
          StringGrid1.cells[1,a]:= inttostr(strtoint (StringGrid1.cells[1,a])+1)
      end else begin
               inc(a);
               StringGrid1.cells[1,a] := '1';
               StringGrid1.cells[0,a] := x.strings[b];
               StringGrid1.RowCount := StringGrid1.RowCount+1;
               end;
      end else begin
               StringGrid1.cells[0,a]:=x.Strings[b];
               StringGrid1.cells[1,a]:='1';
      end;
   end;
//   finally;
//  stringgrid1.rows.endUpdate //fehlermeldung: [ erwartet
x.Destroy;
StopZeit := Now;
StatusBar6.Panels[1].Text :='SuchZeit : '+ FormatDateTime('nn:ss:zzz', StopZeit - StartZeit) ;
Screen.Cursor := crDefault;
end;
Try finally hab ich jetzt nur reingesetzt, sicher bin ich mir nicht wozu das gut sein soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr.
Seite 2 von 5     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