Autor Beitrag
bad-newbie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mi 05.01.05 23:13 
Hey Leute ich hab ein kleinen Problem.
Ich hab eine TxT Datei mit mehr als 12K einträgen und es dauert ewig bist bist die in die Listview umgesetzt wird.

Der Source ist recht simpel gehalten aber es dauert halt ewig bei mehr als 12.000 wenn nicht sogar 60.000 einträgen, hat jemand ne Idee wie das schneller gehen könnte ohne eine Datenbank?

Wäre sehr dankbar wenn jemand eine Idee hat!
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure Alpha.ClickClick(Sender: TObject);
var
 i: integer;
 s: string;
 LastItem: TListItem;
begin
  IF memo1.Lines.Count = 0 then
    begin
      Showmessage('Keine Daten verfügbar');
      exit;
    end;
      for i := 0 to memo1.Lines.Count do
        begin
          s := memo1.Lines[i];
            if Pos('Alpha:', s) <> 0 then
              begin
                LastItem := LV.Items.Add;
                LastItem.Caption := Copy(s, 7, Maxint);
                LastItem.SubItems.Add('');
                LastItem.SubItems.Add('');
             end
            else
              if Pos('Beta:', s) <> 0 then
                LastItem.SubItems.Insert(0, Copy(s, 5, Maxint))
               else
                If Pos('Gamma:', s) <> 0 then
                  LastItem.SubItems.Insert(1, Copy(s, 7, Maxint))
        end;
          Status.SimpleText := InttoStr(LV.Items.Count)+' Einträge';
          Memo1.Clear;
end;
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 05.01.05 23:33 
poste doch bitte auch den inhalt der liste die du laden willst :twisted:
bad-newbie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mi 05.01.05 23:43 
Das ist der Inhalt von dem Memofeld was halt in der Listview nebeneinander stehen soll.
Die Listview hat auch dem entsprechend 3 "Titel" (Alpha - Gamma).
Der Inhalt ist auch immer Verschieden nur "Titel:" nicht.

Alpha: Alphainhalt
Beta: Betainhalt
Gamma: Gammainhalt
-------------------
Alpha: Alphainhalt
Beta: Betainhalt
Gamma: Gammainhalt
------------------
usw.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 06.01.05 00:27 
Die Verwendung der BeginUpdate und EndUpdate-Methoden bringt (evtl.) wesentliche Verbesserung.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
bad-newbie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 06.01.05 16:58 
Ja das hatte ich auch irgendwo gelesen, nur das problem ist ich weiß nicht wirklich wo ich die einsetzen soll... hatte mehrere möglichkeiten ausprobiert aber nichts hat geholfen. :(
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 06.01.05 17:04 
Na der Name sagt es doch eigentlich schon. ListView.Beginupdate rufst du vor deiner Update-Orgie, also vor dem Laden der Textdatei auf und ListView.Endupdate eben danach. Probiers doch einfach mal!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 06.01.05 17:09 
Hast du schon mal einen Eintrag in einer Liste mit 60.000 Einträgen? Überdenk noch mal dein Programmdesign, so ist es unbrauchbar für den Anwender.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 06.01.05 17:10 
Moin!

Elite hat folgendes geschrieben:
Na der Name sagt es doch eigentlich schon. ListView.Beginupdate rufst du vor deiner Update-Orgie, also vor dem Laden der Textdatei auf und ListView.Endupdate eben danach. Probiers doch einfach mal!

Habt ihr ein anderes Delphi/Komponenten als ich? Ich habe nur:
ausblenden Delphi-Quelltext
1:
ListView1.Items.BeginUpdate;					

Habe ein ähnliches Problem bei einem meiner Programme, aber trotz der Begin/EndUpdate-Kapselung dauert es bei mir auch Minuten (~5-6) für ca. 2000 Einträge...
Mir scheint, das ListView ist nicht wirklich für viele Items geschaffen.

Noch einer einen Tipp?

cu
Narses
tomtom62
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278

WIN 2000, XP prof
D5 prof.
BeitragVerfasst: Do 06.01.05 17:22 
Wie wäre es, wenn Ihr die Einträge in eine Stringlist schreibt und die dann per Assign dem Listview bzw. Memo zuordnet ?.

Spontane Idee, nicht ausprobiert :wink:

Thomas
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 06.01.05 17:23 
Moin!

Was mach ich dann mit den Subitems? Nette Idee, wird aber nix, schätze ich.

cu
Narses
tomtom62
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278

WIN 2000, XP prof
D5 prof.
BeitragVerfasst: Do 06.01.05 17:30 
Dann erstell doch mal dynamisch zur Laufzeit ein nicht sichtbares TListview. Erstelle dort die Einträge und füge dann diese TListitems per Assign dem sichtbaren Listview hinzu..
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 06.01.05 18:45 
Auch wenn ihr das schneller hinbekommt, macht es keinen Sinn. Der Anwender wird ja vom dem Listview erschlagen. Was soll er mit 60.000 Einträgen in einem Listvie anfangen?
bad-newbie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 06.01.05 20:55 
Quasi ist da nichts zu machen ? Oder gibt es noch eine andere möglichkeit solche datenmengen schnell zu verarbeiten ?
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 06.01.05 21:08 
ich selber habe noch nicht damit gearbeitet, aber gugg dir mal das virtuelle Listview bzw. listview.ownerdata an. unter demos im Delphi-ordner ist auch Beispiel. Damit füllst du nicht das komplette listview, sondern nur die gerade benötigten Bereiche.
Alternative und natürlich die OH

ansosnten solltes du auch darauf achten, daß du keine angepaßten Spaltenbreiten (columheaderwidth und columnstextwidth) verwendest, das dauert selbst bei wenigen Einträgen auch schon spürbar länger.

allerdings hast du auch noch nicht die Frage beantwortet, was ein anwender mit sovielen Einträgen soll.

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 06.01.05 21:17 
bad-newbie hat folgendes geschrieben:
Quasi ist da nichts zu machen ?

Optimieren kann man es bestimmt. BeginUpdate und EndUpdate wären ein Anfang, aber irgendwo ist dann Schluss mit optimieren. Und 60.000 Einträge sind eben schon eine Menge Stoff. Was erwartest du? Wunder?


Und noch mal, was willst du mit 60.000 Einträgen in dem Listview?
bad-newbie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 07.01.05 17:45 
Naja es können bis zu 60K werden die denn aber wiederrum gefiltert werden das denn vllt nur ein paar 100 drin sind.
Das Programm soll halt die Zugriffe auf eine Sache "aufzeichnen" und später soll man halt noch einige sachen einstellen können.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 07.01.05 19:43 
Warum nutzt Du dann nicht eine DB?

Aber wenn du im ListView-Style bleiben willst, kann ich Dir auch ne VirtuelTreeView (Zusatzkompo, Freeware) empfehlen. Die soll angeblich 500000 Nodes je Sekunde speichern können ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
bad-newbie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 07.01.05 23:10 
Hatte ja auch schon daran gedacht aber geht auch nicht wirklich.

Das mit der Zusatzkompo wär noch ne Idee, werd mich morgen auch nochmal dran setzen und das mit der VirtuelListView testen.

Aber heißen dank an euch alle für die Ideen!