![]() |
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 |
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) |
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:
aufzurufen. Nach dem Abarbeiten nicht das
StringList.BeginUpdate;
Delphi-Quellcode:
vergessen! (Kann dir leider im Moment nicht sagen, ob Begin- bzw. EndUpdate einen Geschwindigkeitsvorteil für dich bringt).
StringList.EndUpdate;
mfg |
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 > ![]() (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. |
Re: TStringlist mit 60000 Einträgen zu langsam
Zitat:
|
Re: TStringlist mit 60000 Einträgen zu langsam
Moin, moin,
Zu Listen gibt es in der DP einen interesanten Thread: ![]() Grüße // Martin |
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 |
Re: TStringlist mit 60000 Einträgen zu langsam
Zitat:
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:
Alles nur ein Beispiel. Ich denke das wird dein Problem sein.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; ... |
Re: TStringlist mit 60000 Einträgen zu langsam
Zitat:
Je nach Aktionen die du auf der Stringlist (Suchen, IndexOf, ...) machst wäre eine Hash-Table oder B-Tree günstiger. |
Re: TStringlist mit 60000 Einträgen zu langsam
Zitat:
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 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz