Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TStringlist mit 60000 Einträgen zu langsam (https://www.delphipraxis.net/147517-tstringlist-mit-60000-eintraegen-zu-langsam.html)

friedemann2009 10. Feb 2010 12:36


TStringlist mit 60000 Einträgen zu langsam
 
Liebe Leute,

ich habe eine Liste in einer Stringlist mit teilweise über 60-100.000 Einträgen, die ich derzeit der Reihe nach abarbeiten muss. In jeder Zeile sind mit TAB getrennt 3 Wörter, von denen immer ein bestimmtes herausgezogen und in eine neue Stringlist übertragen wird.

Mein Problem: Wenn ich die Liste durchgehe, dauert es ewig: >5 Minuten für 30000 Einträge (Netbook mit 1,4 Ghz und 1GB RAM).

Hat jemand eine Idee, wie ich das (SEHR) viel schneller hinbekomme?

Danke für Eure Mühe und Hilfe, viele Grüße,
friedemann

PS: Delphi 5

Bernhard Geyer 10. Feb 2010 12:37

Re: TStringlist mit 60000 Einträgen zu langsam
 
Umstellen auf TListView mit virtuellen Modus
Umstellen auf VirtualStringTree mit virtuellen Modus
Umstellen auf TElTreeStringgrid (mit virtuellen Modus)

patti 10. Feb 2010 12:42

Re: TStringlist mit 60000 Einträgen zu langsam
 
Was du auch noch probieren könntest, wäre vor dem Abarbeiten bei beiden Stringlists ein

Delphi-Quellcode:
StringList.BeginUpdate;
aufzurufen. Nach dem Abarbeiten nicht das

Delphi-Quellcode:
StringList.EndUpdate;
vergessen! (Kann dir leider im Moment nicht sagen, ob Begin- bzw. EndUpdate einen Geschwindigkeitsvorteil für dich bringt).

mfg

himitsu 10. Feb 2010 12:44

Re: TStringlist mit 60000 Einträgen zu langsam
 
@Bernhard: StringList und nicht StringGrid (ich geh mal davon auß, daß er sich da nicht verschrieben hat)

Wie verarbeitesten du denn diese Liste
und wie groß ist diese (der Text in Byte)?

100.000 Einträge ist jetzt nicht sehr viel.

Erstmal könntest du den langsamen Speichermanager von Delphi austauschen > Bei Google suchenFastMM
(in neueren Delphis wurde er schon ausgetauscht)

Und jetzt kann man erstmal nur noch deine Verarbeitung versuchen zu optimieren, aber diese kenne wir noch nicht.


PS: BeginUpdate bringt bei einer reinen/alleinstehenden StringListe nicht viel, da dieses OnChange-Ereignisse und ähnliches, wie GUI-Aktualisierungen unterbindet, welche es bei einer enzelnen TStringList nicht unbedingt gibt.

Mithrandir 10. Feb 2010 12:47

Re: TStringlist mit 60000 Einträgen zu langsam
 
Zitat:

Zitat von himitsu
Und jetzt kann man erstmal nur noch deine Verarbeitung versuchen zu optimieren, aber diese kenne wir noch nicht.

Eben. Ich denke, hier liegt der Flaschenhals. Vielleicht zeigts du mal etwas Code. ;)

mschaefer 10. Feb 2010 12:48

Re: TStringlist mit 60000 Einträgen zu langsam
 
Moin, moin,

Zu Listen gibt es in der DP einen interesanten Thread: Vergleich von Suchverfahren in Listen

Grüße // Martin

hoika 10. Feb 2010 12:49

Re: TStringlist mit 60000 Einträgen zu langsam
 
Hallo,

ich würde mal MemCheck (oder FastMM) nehmen,
dann die Liste füllen und das Programm ohne List.Free beenden.
Dann bekommst du genau raus, wie viel Speicher die Liste braucht.

Oder für grobere Schätzung den Task-Manager nehmen.


Die 1 GB RAM könnten schon das Problem sein,
wenn Delphi auch noch offen ist.
Zumal du ja einen Teil der Strings in eine 2. Liste packst,
die dann auch noch Speicher frißt (ähem isst ;) ).



Heiko

Tyrael Y. 10. Feb 2010 13:24

Re: TStringlist mit 60000 Einträgen zu langsam
 
Zitat:

Zitat von Daniel G
Zitat:

Zitat von himitsu
Und jetzt kann man erstmal nur noch deine Verarbeitung versuchen zu optimieren, aber diese kenne wir noch nicht.

Eben. Ich denke, hier liegt der Flaschenhals. Vielleicht zeigts du mal etwas Code. ;)

Genau dies wird die Stelle sein, die Zeit kostet, da Stringoperationen nicht gerade sehr schnell sind.

Wenn ich in blaue rate, würde ich sagen, daß das Benutzen der StringListe selbt auch schon ein Fehler ist.
Du sagst in jedem Listeintrag steht ein String, der mit TAB getrennt drei Wörter enthält und du nur
diesen String auseinandernimmst, um an deinen gewünschten String zu kommen.

Du solltest eher eine Datenklasse mit drei Feldern benutzen und diese dann in TObjectList schreiben.
Der Vorteil der Datenklasse ist, daß du nicht mühsam etwas aueinander nimmst, sondern direkt den gewünschten Wert hast.

Beispiel:
Delphi-Quellcode:

type
  TMeineDaten = class
   public
     property Bezeichner: String;
     property Strasse: String;
     property Ort: String;
  end;

  ....

  ....
var
  myList: TObjectList;
...
  neueDaten := TMeineDaten.Create();
  neueDaten.Bezeichner := "Stefan";
...
  myList.add(neueDaten);
...
...
  for i := 0 to myList.Count-1 do
  begin
    datenAusListe := TMeinDaten(myList[i]);
    Edit1.Text := datenAusListe.Bezeichner;
    ....
  end;
...
Alles nur ein Beispiel. Ich denke das wird dein Problem sein.

Bernhard Geyer 10. Feb 2010 14:09

Re: TStringlist mit 60000 Einträgen zu langsam
 
Zitat:

Zitat von himitsu
@Bernhard: StringList und nicht StringGrid (ich geh mal davon auß, daß er sich da nicht verschrieben hat)

Geh zur Wand und ... :wall:


Je nach Aktionen die du auf der Stringlist (Suchen, IndexOf, ...) machst wäre eine Hash-Table oder B-Tree günstiger.

exilant 10. Feb 2010 14:11

Re: TStringlist mit 60000 Einträgen zu langsam
 
Zitat:

Zitat von friedemann2009
Liebe Leute,

Mein Problem: Wenn ich die Liste durchgehe, dauert es ewig: >5 Minuten für 30000 Einträge (Netbook mit 1,4 Ghz und 1GB RAM).

Hat jemand eine Idee, wie ich das (SEHR) viel schneller hinbekomme?

Danke für Eure Mühe und Hilfe, viele Grüße,
friedemann

PS: Delphi 5

Also: Ich erzeuge hier eine Liste mit 500.000 Einträgen (zufällig erzeugte Strings). Das Füllen dauert auf einem
Acer nettop mit 1,6 Ghz und 1GB Ram gute 3 Sekunden, die Liste enthält danach ca. 65MB Daten.

Das durchsuchen der Stringliste nach einem ebenfalls zufällig generierten Teilstring mit anschliessendem umkopieren eines viertels der Liste in eine neue Liste in zufälligen Abständen dauert weniger als 1 Sekunde.
Am Rechner und an TStringlist kann es nicht liegen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:28 Uhr.
Seite 1 von 5  1 23     Letzte »    

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