Ersetzen mittels RegEx (ARE, wxRE_ADVANCED) – Exponentieller Anstieg des Speicherverbrauchs, Absturz



  • Da ich eine CSV-Datei (exportiert aus ProcessMonitor) einfach in ein vernünftig lesbares Format umwandeln wollte und nur einige Spalten extrahieren, habe ich mich dafür entschieden, die Datei in Code::Blocks zu öffnen und Ersetzen mit einem regulären Ausdruck drüberlaufen zu lassen.
    C::B verwendet dafür advanced regular expressions (AREs), eine Erweiterung der extended regular expressions (laut Referenz). Dort ist die Referenz, die ich verwendet habe: http://docs.wxwidgets.org/stable/wx_wxresyn.html#wxresyn
    Es ist wahrscheinlich, dass ich einfach nur etwas dummes getan habe, da ich fast keine Erfahrung mit regulären Ausdrücken habe (ich habe ihn einfach nach der Referenz zusammengebaut).
    Ich möchte an den Inhalt von Path , ohne Anführungszeichen.

    =<- Das Format der Datei ->=
    "Time of Day","Process Name","PID","Operation","Path","Result","Detail"
    =<- Einige Ausdrücke, die ich verwendet habe ->=
    (?:".*?",){4}?"(.*?)".*?$
    ^(?:"[^"]*?",){4}?"([^"]*?)".*?$
    

    (Natürlich habe ich rumprobiert, aber das sind die zwei, die wohl am wichtigsten sind)
    Einige Zeilen einzeln zu ersetzen verursacht keine Probleme (wobei es schon da verdächtig lange braucht), aber wenn ich anklicke, dass alle ersetzt werden sollen, dauert es ungefähr zehn Minuten, bis C::B endlich abstürzt; währenddessen rechnet ein Thread ständig und der Speicherverbrauch steigt (der Kurve nach) exponentiell bis auf 1,8 GB (obwohl die Datei nur 2,9 MB groß ist).

    Meine Frage ist eigentlich nur, was ich verändern muss, damit ich das erwünschte Ergebnis in endlicher, geringer Zeit und mit ausreichend wenig Speicherverbrauch auf demselben Rechner bekomme. 😉



  • Sieht eigentlich richtig aus. Es hat etwas viele unnötige Fragezeichen, und gerade die kosten manchmal recht viel Performance (im Prinzip heisst das: Nimm so viel wie geht und backtracke dann bis es minimal wird). Besser wäre daher ^(?:"[^"]*",){4}"([^"]*)".*$ . Würde mich aber wundern, wenn das den Unterschied macht. Zumal ^...$ ja heisst, dass nur eine einzige Zeile angeschaut wird, da kann es ja prinzipiell nicht sein, dass 1,8 GB Speicher allokiert werden.



  • Danke für die Antwort, aber leider geht es auch mit deinem Vorschlag nicht.
    Sollte ich stattdessen annehmen, dass das ein Bug ist?

    Ich werde mal ein anderes Programm für Windows suchen, das mit RegEx klar kommt (und nicht allzu aufwendig installiert werden muss) und es damit probieren.
    [Absenden vergessen]
    Hm, ich habe mich zwar daran erinnert, dass ich mal IntelliJ Idea installiert
    [Fx abgestürzt]
    Damit ging es endlich 🙂 (wobei es etwas aufwendig war – ein Projekt zu erstellen, nur um eine Datei zu bearbeiten, ist fast genau so blöd, wie sich erstmal alle Ergebnisse anzeigen lassen zu müssen, bevor sie ersetzt werden können (die Schaltflächen waren deaktiviert) …)
    Es ist wohl ein Fehler in der RegEx-Bibliothek von C::B (ich habe auch noch eine ältere Version, das könnte also durchaus sein)

    Danke, wxresyn, fürs drüberschauen. 🙂



  • Ich würde noch weitergehen und den Rest der Zeile ignorieren:

    ^(?:"[^"]*",){4}"([^"]*)"
    

    Edit:

    ^(?:"[^"]*",){4}"([^"]+)"
    

    . Mann will einen Pfad haben. (Mit der Leeren Zeichenkette kann man ja als Pfad nichts anfangen)


Anmelden zum Antworten