![]() |
TPerlRegex sehr langsam
Hallo,
Kennt jemand von euch ![]() Ich benutze es so:
Delphi-Quellcode:
Als Subject wird der Inhalt einer gerade mal 600KB großen Textdatei angegeben und es werden ungefähr 30000 Strings gefiltert.
with TPerlRegEx.Create(nil) do try
Subject := sFileContent; RegEx := '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; //Options := [preMultiLine]; //Compile; Result := Match; if Result then repeat sl.Add(MatchedExpression); until not MatchAgain; finally Free; end; Dieser Vorgang dauert gefühlte 30 Sekunden. Muss man da etwas beachten oder wieso ist das so langsam? Ich verwende die Testversion von Delphi2010. |
Re: TPerlRegex sehr langsam
Ich könnte mir vorstellen, dass hier versucht wird Patterns öfter zu matchen:
![]() Versuchs mal so:
Code:
oder du versuchst es mit Assertions:
(?>\d{1,3})\.(?>\d{1,3})\.(?>\d{1,3})\.(?>\d{1,3})
Code:
Edit: Die Ausdrücke sind ungetestet. Sollten aber prinzipiell zumindest so funktionieren.
(\d{1,3}(?=\.)){3}\d{1,3}
Viele Grüße |
Re: TPerlRegex sehr langsam
Danke für die Vorschläge.
Der erste Ausdruck funktioniert, dauert aber genau so lange wie meiner; der zweite geht zwar recht schnell, liefert aber leider keine Matches. Die Seite ist leider gerade nicht erreichbar. |
Re: TPerlRegex sehr langsam
Hallo luke2,
ist sl eine einfache Stringliste, oder verweist die Variable auf eine sichtbare Komponente (Memo o.ä.)? Im letzten Fall sollte es helfen, das Füllen der Liste mit den Methoden ![]() ![]() Gruß Hawkeye |
Re: TPerlRegex sehr langsam
Hallo Hawkeye,
Es ist eine einfache Stringliste, auch nicht sortiert oder so. Ich habe die Zeile mit dem sl.add() auch einmal auskommentiert, brachte aber keine Änderung. Es muss der Aufruf von MatchAgain sein, der so langsam ist, aber leider habe ich den Quellcode nicht, um nachzuschauen, was dort passiert. :? |
Re: TPerlRegex sehr langsam
Hallo,
geh mal auf Nummer sicher und teste die Geschwindigkeit wie folgt:
Delphi-Quellcode:
Ansonsten kannst auch mal die Lib testen:
var
blub : Int64; begin {... } blub := GetTickCount(); Result := Match; if Result then repeat //sl.Add(MatchedExpression); until not MatchAgain; blub := GetTickCount() - blub; ShowMessage(IntToStr(blub) + ' Millisekunden); ![]() |
Re: TPerlRegex sehr langsam
Das ergibt einen Wert von 24960 = 25 Sekunden, das ist - finde ich - für 600KB Daten einfach zu langsam!
Diese Komponente basiert doch auch auf der pcre.dll und kapselt nur die Aufrufe, deshalb verstehe ich nicht, wieso das so langsam ist :?: |
Re: TPerlRegex sehr langsam
Zitat:
Code:
Match kam erfolgreich zurück. Sollte so auch relativ schnell sein.
(\d{1,3}(?>\.)){3}(?>\d{1,3})
Schau mal, ob das bei dir die richtigen Matches liefert. Viele Grüße |
Re: TPerlRegex sehr langsam
Dieser Ausdruck liefert mir die korrekten Matches dauert aber wieder um die 20 Sekunden. :|
Wie hast du die pcre.dll denn eingebunden? dieses TPerlRegEx bindet es statisch ein, so dass die dll von der Anwendung nicht mehr benötigt wird. Aber mit der Geschwindigkeit kann das doch nichts zu tun haben, oder? |
Re: TPerlRegex sehr langsam
Ich verwende:
![]() Allerdings auf D2010 angepasst (string->AnsiString, PChar->PAnsiChar, PCRE 6.7 Lib pcre.dll - muss der Anwendung beigelegt werden). Lade mal die Test-Datei (also dort wo die gesuchten Einträge drin sind) hoch, dann kann ich genauere Geschwindigkeitstests machen ... Viele Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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