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 1 von 5  1 23     Letzte »    
Franzelchen

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

TStringlist, THashedStringlist gibts nichts schnelleres??

  Alt 23. Mär 2010, 13:12
Hallo DPler,

TStringlist, THashedStringlist gibts nichts schnelleres?? und genauso komfortables. Ich meine die Funktionen Stringlist.LoadfromFile .SavetoFile .Strings[i].
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 13:41
Zitat von Franzelchen:
Ich meine die Funktionen .LoadfromFile .SavetoFile
Nein, denn überall muß die Datei eingelesen, zerlegt und die Strings im "RAM" abgelegt werden.
Und bei der THashedStringList muß zusätzlich noch pro String ein Hash beechnet werden.

.Strings[i] ist bei der "normalen" StringList oder bei einem Array am schnellsten, da man dort direkt via Index zugreifen kann.
Bei der HashedStringList, SkipList und ihren Verwandten kommt es dann darauf an, ob neben der HashMap auch noch eine Index-Liste existiert.

Das schnellste LoadfromFile wäre alles in EINEN String oder einen MemoryStream zu lesen, aber dann gibt es keinen Index und man kann nicht direkt via .Strings[i] zugreifen.

PS: Wenn nur via .Strings[i] zugegriffen wird, dann ist die THashedStringList vollkommen überflüssig, weil sie auf eine Stringsuche ausgelegt ist und nicht für einen Indexzugriff.
$2B or not $2B
  Mit Zitat antworten Zitat
Franzelchen

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 13:46
Natürlich gibt es die vielbeschworene Skiplist. Diese würde sogar (vgl. Suchverfahren mit Beispielen) meine Dateigröße abdecken( ca.40 000 Datensätze) aber wie verwende ich die Skiplist. In allen Beispielen wird die Skiplist mit Zufallsstrings aufgefüllt aber nie mit echten Daten.
Also wie bekomme ich eine Datei in die Skiplist (LoadfromFile) und wie kann ich mit der Skiplist arbeiten (Strings[i]) und wie Speichere ich die Daten der Skiplist (SaveToFile).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 13:52
Zitat von Franzelchen:
Natürlich gibt es die vielbeschworene Skiplist.
Ließ bitte mal alles, auch das, welches ich noch nacheditiert hab.

Wenn du nur .LoadFromFile .SavetoFile und .Strings[i] verwendest, dann ist TStringList mitunder das Schnellste.

Schneller geht es nur (wenn die Liste nicht im Programm verändert werden soll oder wenn SaveToFile etwas länger dauern darf), wenn man alles an einem Stück einließt und dann nur eine Indexliste mit den Stringanfängen/-längen anlegt und wenn auf alle Strings/Zeilen maximal ein-/zweimal zugegriffen wird oder wenn einem der Speicherverbrauch für eine doppelte Datenhaltung egal ist.
$2B or not $2B
  Mit Zitat antworten Zitat
Franzelchen

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 14:05
Zitat von himitsu:

Wenn du nur .LoadFromFile .SavetoFile und .Strings[i] verwendest, dann ist TStringList mitunder das Schnellste.
Da ich außer dem genannten nur noch .sort verwende habe ich also Pech gehabt. Schade.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 14:23
Wenn du "sehr oft" etwas ändern/einfügen/löschen und auch sortieren würdest und "selten" via .Strings[i] zugreifst, dann wäre eine HashList ('ne SkipList ist auch eine) insgesamt schon schneller.
$2B or not $2B
  Mit Zitat antworten Zitat
Franzelchen

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 14:31
Ich benötige die Stringliste nur zum sortieren,laden,speichern und sehr häufig die .Strings[i] Funktion. Das sortieren benötigt die geringste Zeit, es wäre schon ein erheblicher Fortschritt wenn es einen Weg gäbe der die .Strings[i] Verarbeitung beschleunigen würde.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 14:48
Delphi-Quellcode:
property Strings[Index: Integer]: string read Get write Put; default;

function TStringList.Get(Index: Integer): string;
begin
  if Cardinal(Index) >= Cardinal(FCount) then
    Error(@SListIndexError, Index);
  Result := FList^[Index].FString;
end;
Wie gesagt, .Strings von TStringList (TStrings) ist schon ein direkter Zugriff und schneller als direkt geht es einfach nicht,
außer man nimmt direkt ein dynamisches Array ohne aktivierte Indexprüfung. (siehe Compiler-Schalter oder Projektoptionen)
$2B or not $2B
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 15:00
Zitat von Franzelchen:
Natürlich gibt es die vielbeschworene Skiplist. Diese würde sogar (vgl. Suchverfahren mit Beispielen) meine Dateigröße abdecken( ca.40 000 Datensätze) aber wie verwende ich die Skiplist. In allen Beispielen wird die Skiplist mit Zufallsstrings aufgefüllt aber nie mit echten Daten.
Wo ist denn da nun bitte der Unterschied?
MyList.Add(MyKeyString, MyData) Wo ist eigentlich dein Problem? Selbst 40.000 Datensätze sind doch in Null,Nix eingelesen über eine TStringlist eingelesen. Der Zugriff erfolgt auch schnell genug, und selbst die Suche in einer sortieren Stringlist wäre doch kein Problem, oder?

Zeig uns doch mal den Code, bei dem Du Performanceprobleme bekommst.

Wenn Du noch eine Nanosekunde rausholen willst, dann vergiss die TStringlist und verwende ein ARRAY OF STRING. Das vermeidet den Umweg über einen Getter-Aufruf. Aber verwende keine dynamischs Array weil das ja wieder erst umständlich und performancefressend dereferenziert werden muss

Delphi-Quellcode:
Type
  TTheMotherOfAllSchnelleStringZugriffe = ARRAY [0..39999] OF STRING;
Oder geht es noch schneller?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Franzelchen

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

Re: TStringlist, THashedStringlist gibts nichts schnelleres?

  Alt 23. Mär 2010, 16:27
Hier der Code

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.RowCount:=1; //löscht überflüssige Leerzeilen
  for b:=0 to x.count-1 do
  begin
   progressbar6.Max:= x.Count-1 ;
   progressbar6.position:=b ;
   progressbar6.Update;
      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;
 x.Destroy;
StopZeit := Now;
StatusBar6.Panels[1].Text :='SuchZeit : '+ FormatDateTime('nn:ss:zzz', StopZeit - StartZeit) ;
Screen.Cursor := crDefault;
end;
Dieser Text dauert auf meinem langsamen Rechner ca. 17 sec. Ab markierter Stelle allein etwa 12-13 sec.
Der Rest der Zeit geht für das Sortieren drauf.

Zitat von alzaimar:
MyList.Add(MyKeyString, MyData)
MyKeyString??
Was soll denn das sein? Immer wieder fällt mir Key mit der Add funktion auf aber wozu der Key da ist habe ich keine Ahnung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     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 15:42 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