Ergebnissuche beschleunigen, aber wie ?

  • Hallo,

    ich habe eine Logdatei die ca. 300 MB groß ist. Wenn ich diese via Notepad++ öffne dauert das ca. 3 Sekunden. Wenn ich dann via Strg+F suche und dort die Option "Alle in aktiver Datei suchen" anklicke, habe ich nach ca. 7 Sekunden mein Ergebnis, welches ich brauche.

    Ich will das natürlich nicht mit Notepad++ lösen, sondern mit einem Autoitscript, welches ich mal hier kurz zusammen geklopft habe

    [autoit]


    Global $sfile

    [/autoit][autoit][/autoit][autoit]

    $sfile = @ScriptDir & "\textdatei.log"; Ist das ca. 300 MB Logfile

    [/autoit][autoit][/autoit][autoit]

    Example()

    [/autoit][autoit][/autoit][autoit]

    Func Example()
    ; Read the current script file into an array using the filepath.
    Local $aArray = FileReadToArray($sfile)
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file.
    Else
    For $i = 0 To UBound($aArray) - 1 ; Loop through the array.
    Local $iXFDLPosition = StringInStr($aArray[$i], "XFDL:", 0)
    If $iXFDLPosition = 0 Then
    ConsoleWrite("Zeile " & $i & ": Kein XFDL in Zeile enthalten" & @CRLF)
    Else
    ConsoleWrite("Zeile " & $i & ": " & ($aArray[$i]) & @CRLF)
    EndIf
    Next
    EndIf
    EndFunc ;==>Example

    [/autoit]

    Mein Problem: Bis meine Ergebnisliste fertig ist, dauert das ca. 12 Minuten.

    Wie kann ich sowas schneller hinbekommen ?

    Einmal editiert, zuletzt von HassanMullah (6. Mai 2014 um 13:31)

  • Richtet sich bisschen danach ob du die Positionen aller Funde haben willst, oder nur wissen willst ob der String vorkommt.

    • Notepad++ lädt bei großen Dateien nicht die gesamte Datei sondern nur den Anfang und lädt bei Bedarf weitere Teile nach.
      Das ist schonmal der erste Unterschied zu deinem Skript.
      Wenn du mit FileRead oder FileReadLine arbeitest kann das eine Menge bringen wenn die Textstelle nicht gerade am Ende der Datei steht, da somit das komplette Einlesen der Datei vermieden wird.
    • Musst du wirklich zeilenweise durchgehen? Ein FileRead und ein einziges StringInStr statt der Zeilenschleife können das Ganze beschleunigen.
    • Wenn die Datei 300mb groß ist und entsprechend viele Zeilen existieren, benötigt dein Skript schonmal Ewigkeiten die ganzen Konsolenausgaben zu schreiben.
      Hast du es mal versucht was es an Zeit bringt wenn du das erste Consolewrite (kein Fund) rausschmeißt?
    • Wenn der Suchstring "XFDL" bei dir immer groß geschrieben wird dann kannst du StringInStr beschleunigen, wenn du den casesense-Parameter auf 1 setzt.
  • Danke für die Tips :-)))))))))

    Hier das neue Script:

    [autoit]


    Global $sfile

    [/autoit][autoit][/autoit][autoit]

    $sfile = @ScriptDir & "\textdatei.log"; Ist das ca. 300 MB Logfile
    Local $LogFile = FileOpen(@ScriptDir & "\lalala.txt", 2)

    [/autoit][autoit][/autoit][autoit]

    Example()

    [/autoit][autoit][/autoit][autoit]

    Func Example()
    FileWriteLine($LogFile, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & ": Verzeichnis " & @ScriptDir & "\lalala.txt erstellt" & @CRLF & @CRLF)
    ; Read the current script file into an array using the filepath.
    Local $iXFDLPosition
    Local $aArray = FileReadToArray($sfile)
    If @error Then
    FileWriteLine($LogFile, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & ": Fehler beim Lesen von" & $sfile & "@error: " & @error & @CRLF & @CRLF)
    Else

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($aArray) - 1 ; Loop through the array.
    $iXFDLPosition = StringInStr($aArray[$i], "XFDL:", 1)
    If $iXFDLPosition <> 0 Then
    FileWriteLine($LogFile, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & ": Zeile " & $i & ": " & ($aArray[$i]) & @CRLF)
    EndIf
    Next
    EndIf
    FileWriteLine($LogFile, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & ": Verzeichnis " & @ScriptDir & "\TextLog.txt beendet" & @CRLF & @CRLF)
    FileClose($LogFile)
    ConsoleWrite("Fertig")
    EndFunc ;==>Example

    [/autoit]

    Ergebnis: Von ca. 12 Minuten auf 4 Sekunden runtergebrochen.

    Vielen Vielen Vielen DANK !!!!!!