TStringlist, THashedStringlist gibts nichts schnelleres??
Hallo DPler,
TStringlist, THashedStringlist gibts nichts schnelleres?? und genauso komfortables. Ich meine die Funktionen Stringlist.LoadfromFile .SavetoFile .Strings[i]. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
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. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
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). |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
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. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
|
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
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. :angel2:
|
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
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.
|
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Delphi-Quellcode:
Wie gesagt, .Strings von TStringList (TStrings) ist schon ein direkter Zugriff und schneller als direkt geht es einfach nicht,
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; außer man nimmt direkt ein dynamisches Array ohne aktivierte Indexprüfung. (siehe Compiler-Schalter oder Projektoptionen) |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
Delphi-Quellcode:
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?
MyList.Add(MyKeyString, MyData)
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 :gruebel: :zwinker:
Delphi-Quellcode:
Oder geht es noch schneller?
Type
TTheMotherOfAllSchnelleStringZugriffe = ARRAY [0..39999] OF STRING; |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Hier der Code
Delphi-Quellcode:
Dieser Text dauert auf meinem langsamen Rechner ca. 17 sec. Ab markierter Stelle allein etwa 12-13 sec.
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; Der Rest der Zeit geht für das Sortieren drauf. Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 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