AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TStringlist, THashedStringlist gibts nichts schnelleres??
Thema durchsuchen
Ansicht
Themen-Optionen

TStringlist, THashedStringlist gibts nichts schnelleres??

Ein Thema von Franzelchen · begonnen am 23. Mär 2010 · letzter Beitrag vom 13. Apr 2010
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 15:33
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!
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#12

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 15:50
Bitte wie?? was?

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 ?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#13

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 15:58
@ 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
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#14

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:20
Er schreibt, dass das Befüllen des StringGrid sehr langsam ist ... und das glaube ich sogar

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#16

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:24
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 ...
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#17

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:26
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
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:28
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#19

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:34
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.
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#20

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 24. Mär 2010, 13:31
Zitat von Sir Rufo:
Er schreibt, dass das Befüllen des StringGrid sehr langsam ist ... und das glaube ich sogar

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 05:35 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