Hallo Leute, nachdem ich zufälligerweise auf Lazarus mit WinCe gestoßen bin, stehe ich gleich vor meinem ersten Problem:
Ich habe 1200 Datensätze in einer Textdatei. Nun wird jede Zeile mit einem Substring verglichen und bei Übereinstimmung in ein Listview ausgegeben. Mein Problem ist die Geschwindigkeit. Das Durchsuchen dauert etwa 17sec und ich werde die Anzahl der Datensätze auf über 10000 erweitern müssen. Ist dies möglich ohne mehrere Minuten zu warten oder überforder ich dabei die Möglichkeiten eines Pocket PCs?
var
StrFile:Tstrings;
i:integer;
begin
StrFile := TStringList.create;
strfile.loadfromfile(ExtractFilePath(Application.ExeName)+'test.txt'); //TxtDatei laden
ListView1.Clear; //Listview leeren
ListView1.beginUpdate; //Neuzeichnen verhindern
for i := 0 to strfile.Count -1 do
begin
if (Pos(edit1.text,strfile[i])> 0) then //Edittext mit Datensatz vergleichen
begin //...bei Übereinstimmung...
ListView1.Items.Add; //hinzufügen
listview1.items[ListView1.Items.count-1].Caption := strfile[i];
end;
end;
ListView1.endupdate; //Neuzeichnen
end;
Du schreibst nicht,. wie lang die einzelnen Sätze sind. Wenn das wirklich 10 mSek pro Satz dauert, sind die bestimmt einige Megabyte groß (sooo langsam kann so ein ARM Prozessor doch nicht sein).
"pos" sucht, so vermute ich, auf die simple Art (Startpunkt immer um einen Character verschieben). Es gibt ein Verfahren, das Teilstrings in großen Strings viel effektiver suchen kann. Ich habe den Code schon einmal gesehen, den Namen vergessen. Könnte sein dass es in der Jedi-Library ist. Sonst musst Du im Internet suchen.
procedure TForm1.Button2Click(Sender: TObject);
var
t: System.Text;
sIn, sEdit: ShortString;
begin
System.Assign(t, ExtractFilePath(Application.ExeName)+'test.txt');
System.Reset(t);
ListView1.Clear;
ListView1.BeginUpdate;
sEdit:= Edit1.Text;
while not EOF(t) do begin
System.Readln(t, sIn);
if System.Pos(sEdit, sIn) > 0 then begin
ListView1.Items.Add;
listview1.items[ListView1.Items.count-1].Caption := sIn;
end;
end;
ListView1.EndUpdate;
System.Close(t);
end;
geht aber nur, wenn Deine Zeilen kürzer als 256 Zeichen sind. Bin mir aber nicht sicher, ob die Auswirkung unter CE auch so groß ist.
ich würde sagen das laden in eine TStringlist dauert auch seine zeit !
was währes wenn du auf eine TStringlist versichtes ? und mit reinen Textfiele funktionen Arbeites ?
dann könntes du direkt beim lesen eine Zeile in die ListView anzeigen.
Ich sehe da gerade noch was: bei so großen Datenmengen würde ich aus der ListView eine Virtual list machen das kannst du einstellen.... such mal in http://www.delphipraxis.de" onclick="window.open(this.href);return false; nach ListView Virtual oder
her ein direkter link: http://www.delphipraxis.net/search.php? ... 49&start=0" onclick="window.open(this.href);return false;
Bei sovielen Daten müsstes du die verwaltung selbst in die hand nehmen.
Erstmal danke für eure Vorschläge und Entschuldigung das ich nicht früher antworten konnte.
1. Die Datensätze waren je etwa 50 Zeichen lang...mehr brauch ich auch nicht. (Hätte auch nicht gedacht, dass das so langsam ist;) )
2. Das mit den Shortstrings probier ich gleich mal aus.
3. Das Laden der Stringlist braucht kaum Zeit. in meinem ursprünglichen Code wurde diese beim Starten des Programms bereits geladen...das Suchen dauerte trotzdem solange.
4. Die Pos Funktion ist nicht das Problem...ich hab die Procedure mal ohne vergleichen und nur mit auslesen des Datensatz laufen lassen...gleiche Zeit.
5. TDbf kenn ich bis jetzt noch nicht werd ich aber gleich mal googlen
Brauchst du net gross googlen ist in lazarus/components zu finden einfach mal das lpk installiern und wie TTable aus der bde benutzen. geht sogar Multiuser
Achso, thx. Ja wenn das so schau ich mir die Komponente mal an, hab leider kaum Ahnung von Datenbanken:( Aber wenn mir das hier die Geschwindigkeit bringt die ich brauche, arbeite ich mich gern ein;)
@ Christian: Programmierst du zufällig auch für WinCe, denn ich habe jetzt ein Bsp mit TDbf für Win32 geschrieben, wenn ich jedoch für WinCe kompiliere bekomme ich den Fehler "LResources.pp(25,69) Fatal: Can't find unit Dbf"
Also hab weitestgehend Bernds Vorschlag übernommen (THX;)). Das direkte durchsuchen der Datei ist um einiges schneller. Dazu kommt, dass die TListview Komponente sehr langsam ist=> Gegen Stringgrid ersetzt
Nun komme ich auf 3sec Suchzeit (13000 Shortstring Datensätze), absolut akzeptabel:)