AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TPerlRegex sehr langsam

Ein Thema von luke2 · begonnen am 18. Mär 2010 · letzter Beitrag vom 13. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#1

TPerlRegex sehr langsam

  Alt 18. Mär 2010, 13:06
Hallo,

Kennt jemand von euch TPerlRegex?

Ich benutze es so:
Delphi-Quellcode:
  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;
Als Subject wird der Inhalt einer gerade mal 600KB großen Textdatei angegeben und es werden ungefähr 30000 Strings gefiltert.
Dieser Vorgang dauert gefühlte 30 Sekunden. Muss man da etwas beachten oder wieso ist das so langsam?

Ich verwende die Testversion von Delphi2010.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 13:10
Ich könnte mir vorstellen, dass hier versucht wird Patterns öfter zu matchen: http://de.php.net/manual/de/regexp.r...e.onlyonce.php

Versuchs mal so:
Code:
(?>\d{1,3})\.(?>\d{1,3})\.(?>\d{1,3})\.(?>\d{1,3})
oder du versuchst es mit Assertions:
Code:
(\d{1,3}(?=\.)){3}\d{1,3}
Edit: Die Ausdrücke sind ungetestet. Sollten aber prinzipiell zumindest so funktionieren.

Viele Grüße
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#3

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 13:17
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 13:24
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 Delphi-Referenz durchsuchenBeginUpdate und Delphi-Referenz durchsuchenEndUpdate zu klammern.

Gruß Hawkeye
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#5

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 13:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 13:57
Hallo,

geh mal auf Nummer sicher und teste die Geschwindigkeit wie folgt:
Delphi-Quellcode:
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);
Ansonsten kannst auch mal die Lib testen: http://www.regular-expressions.info/delphi.html
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#7

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 14:11
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 14:11
Zitat von luke2:
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.
So gings mit meiner PCRE library (verwendet auch die pcre.dll, daher sollten die Ergebnisse auch gleich sein):
Code:
(\d{1,3}(?>\.)){3}(?>\d{1,3})
Match kam erfolgreich zurück. Sollte so auch relativ schnell sein.

Schau mal, ob das bei dir die richtigen Matches liefert.

Viele Grüße
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#9

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 14:17
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?
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#10

Re: TPerlRegex sehr langsam

  Alt 18. Mär 2010, 14:19
Ich verwende: http://www.renatomancuso.com/software/dpcre/dpcre.htm
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
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