rippchen

Wie kann man die Arbeitsspeichernutzung bei der Verwendung von PowerShell auf einen bestimmten Wert fixieren (limitieren)?

Gibt es eine Möglichkeit die Verwendung des Arbeitsspeichers zu limitieren ?

Ich benötige nämlich teilweise 38 GB Arbeitsspeicher (inkl. virtuellem Speicher) und mein Prozessor ist dabei nur zu 37 Prozent ausgelastet.

Das Problem tritt bei folgendem Skript auf, welches zur Bearbeitung von CSV Dateien dient:

$folder = 'C:\Users\ICH\Desktop\Import'  
$out = 'C:\Users\ICH\Desktop\Export\Gesamt.csv'  
gci $folder -Filter *.csv -recurse | %{
    $raw = ((gc $_.FullName) | select -Skip 1) 
    $csv = $raw[0..($raw.GetUpperBound(0)-0)]| ConvertFrom-CSV -Delimiter ";" -Header "1","2","Timestamp","4","Modification Timestamp","6","7"   
    $csv | group {get-date $_.Timestamp} | %{
    $_.Group | sort {get-date $_.'Modifikation Timestamp'} -Descending | select -First 1  
} | Sort "Timestamp", "Modification Timestamp" -descending | export-csv $out -Append -Delimiter ";" -Notype -Encoding UTF8     
}

Die Technischen Daten meines Rechners sind:

Prozessor: Intel i7 2600k 4 Kerne, 8 Threads, 4 GHz
Arbeitsspeicher: 16 GB (4 Module, laufen im Dual Channel Modus)
OS: Windows 10 64 Bit Enterprise
PowerShell Version: 5.0.10240.16384

Wünschenswert wäre, wenn die Arbeitsspeicher Nutzung von Powershell auf 12 GB Limitiert wird, da mein Rechner im idle ca. 4 GB benutzt.

VG

Rippchen
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 305709

Url: https://administrator.de/forum/wie-kann-man-die-arbeitsspeichernutzung-bei-der-verwendung-von-powershell-auf-einen-bestimmten-wert-fixieren-305709.html

Ausgedruckt am: 29.04.2025 um 04:04 Uhr

Pjordorf
Pjordorf 30.05.2016 aktualisiert um 11:28:46 Uhr
Goto Top
Hallo,

Zitat von @Rippchen:
Das Problem tritt bei folgendem Skript auf, welches zur Bearbeitung von CSV Dateien dient:
Welches Monster an CSV Datei hast du denn? 50TByte?

Ich benötige nämlich teilweise 38 GB Arbeitsspeicher
Wie hast du dies festgemacht bei deinen 16 GB RAM?

Gruß,
Peter
Rippchen
Rippchen 30.05.2016 um 11:35:43 Uhr
Goto Top
Eine CSV Datei kann bei mir bis zu 1 GB haben. Es sind nämlich viele doppelte und dreifache Messwerte für ein ganzes Jahr, im 15 Min tackt
enthalten.

Ich habe meinen virtuellen Speicher auf 25 GB Hochgesetzt und dementsprechend wird meine SSD sehr stark belastet, welches unschön ist.

VG
Rippchen
129413
Lösung 129413 30.05.2016 aktualisiert um 11:44:01 Uhr
Goto Top
$raw.GetUpperBound(0)-0
Was soll dieses Konstrukt denn bwirken?? Völlig überflüssig wenn der Upperbound sowieso gleich bleibt...
Benutze weniger Variablen in der Schleife und lade nicht die gesamte CSV auf einmal in den Speicher sondern pipe:

$folder = 'C:\Users\ICH\Desktop\Import'  
$out = 'C:\Users\ICH\Desktop\Export\Gesamt.csv'  
gci $folder -Filter *.csv -recurse | %{
    gc $_.FullName | select -Skip 1| ConvertFrom-CSV -Delimiter ";" -Header "1","2","Timestamp","4","Modification Timestamp","6","7" | group {get-date $_.Timestamp} | %{$_.Group | sort {get-date $_.'Modifikation Timestamp'} -Descending | select -First 1} | Sort "Timestamp", "Modification Timestamp" -descending | export-csv $out -Append -Delimiter ";" -Notype -Encoding UTF8  
[System.GC]::Collect()
}
Gruß skybird
Rippchen
Rippchen 12.06.2016 um 13:03:22 Uhr
Goto Top
Vielen Dank. Es funktioniert sehr gut und die Arbeitsspeicherbelastung ist auch sehr gering.

Das mit UpperBound stammt noch aus einem alten Skript und muss manchmal aktiviert werden. Hier aber fast nie, daher kann es ruhig raus.

Mir fällt auf, dass meine CPU nur mit bis zu 14 % ausgelastet wird und der Arbeitsspeicher nun sehr wenig genutzt wird.

Gibt es eine Möglichkeit die CPU mehr auszunutzen, da die Bearbeitung schon sehr lange dauert.

Ich habe nun im Übrigen 32 GB Arbeitsspeicher, die genutzt werden könnten.

Vielen Dank im Voraus.

Rippchen
129413
129413 12.06.2016 aktualisiert um 13:11:00 Uhr
Goto Top
Nutze parallele Threadverarbeitung, z.B. mit Jobs (Start-Job)
Ein Single-Thread wird deinen Prozessor so nie auslasten, das versteht sich ja von selbst denn Powershell startet ja meist im STA (Single Thread Appartment) Mode.
Powershell-Workflows sind dafür z.B, perfekt geeignet mehrere Aufgaben parallel zu verabeiten:
https://blogs.technet.microsoft.com/heyscriptingguy/2012/12/26/powershel ...