Datensätze schneller auslesen (WinCe)

Antworten
DaDu
Beiträge: 7
Registriert: So 18. Feb 2007, 23:09

Datensätze schneller auslesen (WinCe)

Beitrag von DaDu »

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?

Hier mal der Code:

Code: Alles auswählen

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;


Hoffe ihr könnt mir helfen!

Gruß, David

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

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.

-Michael

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Re: Datensätze schneller auslesen (WinCe)

Beitrag von _Bernd »

Hallo,

die Verwendung von ShortStrings bringt zumindest unter Win32 eine Beschleunigung von ca. Faktor 10:

Code: Alles auswählen

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.

Gruß, Bernd.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Oder du nimmst TDbf z.b. und legst indizien für deine Suchfelder an.
Bringt zwar ein paar kb mehr auf die Wage aber dafür bist du schnell.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

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 nach ListView Virtual oder
her ein direkter link:
http://www.delphipraxis.net/search.php? ... 49&start=0

Bei sovielen Daten müsstes du die verwaltung selbst in die hand nehmen.
MFG
Michael Springwald

DaDu
Beiträge: 7
Registriert: So 18. Feb 2007, 23:09

Beitrag von DaDu »

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

Danke euch, David

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

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
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DaDu
Beiträge: 7
Registriert: So 18. Feb 2007, 23:09

Beitrag von DaDu »

Aber dafür müsste ich doch dann eine Datenbankumgebung auf dem PDA installieren, was ich eigentlich umgehen wollte.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nö, wiso ? Tdbf liest und schreibt das dbase Dateiformat nativ, auch die indizien werden nativ unterstützt.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DaDu
Beiträge: 7
Registriert: So 18. Feb 2007, 23:09

Beitrag von DaDu »

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;)

DaDu
Beiträge: 7
Registriert: So 18. Feb 2007, 23:09

Beitrag von DaDu »

@ 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"

Wie kann man Dbf in WinCe nutzen?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

die dbf.pas ist teil der FCL von Freepascal. Es schaut so aus als ob sie nicht compiliert wäre benutzt du ein fertiges Package ?

Solltest den Compiler mal selberbauen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

@DaDu
wenn du eine Stringlist hast die 10000 zeilen umfast geladen werden muss, müste das eigetnlich dauern...
MFG
Michael Springwald

DaDu
Beiträge: 7
Registriert: So 18. Feb 2007, 23:09

Beitrag von DaDu »

Habs geschafft!

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:)

Danke euch, David

Antworten