none
Schlechte Performance einer foreach Schleife RRS feed

  • Frage

  • Hallo Powershell-Gemeinde,

     

    Ich lese eine Textdatei mit 20 Suchwörtern ein, welche in einer lokalen html Datei von 380kb mit 4400 Zeilen zur weiteren Verarbeitung gefunden werden sollen.

    Dieser Vorgang dauert ca. 50 Sekunden. Da ich ähnliche Abfragen für weitere Dateien im script habe, dauert ein Durchlauf ca. 6 Minuten.

    Hierfür nutze ich den unten angegeben code.

    Lässt sich die Performance evtl. über einen anderen weg in der Powershell beschleunigen?

    $ReadRadioplay = Get-Content -Path 'C:\Program Files\Scripte\SucheHörspiele.txt'
    
    $PartialResultRadio0 = Foreach ($Radioplay in $ReadRadioplay)
    {
    Select-String -Path 'C:\Program Files\Scripte\SourceMonthlyRadioPlay.html' -List -Pattern "(.*?)$Radioplay(.*?)" -Context 0, 1
    Danke für eure Ideen!


    • Bearbeitet Sönke T Dienstag, 8. September 2015 10:28 Rechtschreibfehler
    Dienstag, 8. September 2015 10:26

Antworten

  • Du liest für jeden Schleifendurchlauf die HTML Datei neu ein. Ein Weg wäre es also die HTML Datei vorher über Get-Content einzulesen und dann Select-String mit dem Parameter InputObject aufzurufen.

    Edit: Noch als Tip, um Performance Probleme zu finden hilft es Measure-Command zu verwenden, mal als Beispiel:

    Measure-Command {
        $PartialResultRadio0 = Foreach ($Radioplay in $ReadRadioplay) {
            Select-String -Path 'Z:\test.txt' -List -Pattern "(.*?)$Radioplay(.*?)" -Context 0, 1
        }
    }
    
    Measure-Command {
        $ReadRadioplay = Get-Content -Path Z:\test.txt
        $PartialResultRadio0 = Foreach ($Radioplay in $ReadRadioplay) {
            Select-String -InputObject $Radioplay  -List -Pattern "(.*?)$Radioplay(.*?)" -Context 0, 1
        }
    }

    Ersteres benötigt mit meiner Testdatei fast 4 Sekunden, das zweite nur 60 Millisekunden.

    Gruß Olaf


    • Bearbeitet Olaf Reitz Dienstag, 8. September 2015 10:56
    • Als Antwort markiert Sönke T Dienstag, 8. September 2015 13:40
    Dienstag, 8. September 2015 10:44

Alle Antworten

  • Du liest für jeden Schleifendurchlauf die HTML Datei neu ein. Ein Weg wäre es also die HTML Datei vorher über Get-Content einzulesen und dann Select-String mit dem Parameter InputObject aufzurufen.

    Edit: Noch als Tip, um Performance Probleme zu finden hilft es Measure-Command zu verwenden, mal als Beispiel:

    Measure-Command {
        $PartialResultRadio0 = Foreach ($Radioplay in $ReadRadioplay) {
            Select-String -Path 'Z:\test.txt' -List -Pattern "(.*?)$Radioplay(.*?)" -Context 0, 1
        }
    }
    
    Measure-Command {
        $ReadRadioplay = Get-Content -Path Z:\test.txt
        $PartialResultRadio0 = Foreach ($Radioplay in $ReadRadioplay) {
            Select-String -InputObject $Radioplay  -List -Pattern "(.*?)$Radioplay(.*?)" -Context 0, 1
        }
    }

    Ersteres benötigt mit meiner Testdatei fast 4 Sekunden, das zweite nur 60 Millisekunden.

    Gruß Olaf


    • Bearbeitet Olaf Reitz Dienstag, 8. September 2015 10:56
    • Als Antwort markiert Sönke T Dienstag, 8. September 2015 13:40
    Dienstag, 8. September 2015 10:44
  • @Olaf:

    Danke, funktioniert wunderbar! Kein Vergleich zu vorher, nun rennt das script!
    Wie immer, wurde mir hier bestens geholfen!
    Auch danke für den Tip mit dem Measure-Command. Werde ich nun öfter mal nutzen.

    Dienstag, 8. September 2015 13:40