Ich habe eine PowerShell script, die eine große CSV-Datei (4GB +) liest, bestimmte Zeilen findet, schreibt dann die Zeilen in andere Dateien.PowerShell Clearing-Speicher nach Abschluss
Ich merke, dass, wenn es zu "echo" Verarbeitete $ Datenzähler insgesamt Zeilen in der $ Datendatei-Datei "" die letzte Zeile des Skripts, es nicht wirklich bis 5 bis 10 Minuten später fertig ist.
Was macht es für diesen Zeitraum? Wenn dies abgeschlossen ist, sinkt die Speicherbelegung erheblich. Gibt es eine Möglichkeit, es am Ende des Skripts zum Löschen von Speicher zu zwingen?
Screenshot of script timestamps
Hier ist die letzte Version von meinem Skript Referenz.
# Get the filename
$datafile = Read-Host "Filename"
$dayofweek = Read-Host "Day of week (IE 1 = Monday, 2 = Tuesday..)"
$campaignWriters = @{}
# Create campaign ID hash table
$campaignByID = @{}
foreach($c in (Import-Csv 'campaigns.txt' -Delimiter '|')) {
foreach($id in ($c.CampaignID -split ' ')) {
$campaignByID[$id] = $c.CampaignName
}
foreach($cname in ($c.CampaignName)) {
$writer = $campaignWriters[$cname] = New-Object IO.StreamWriter($dayofweek + $cname + '_filtered.txt')
if($dayofweek -eq 1) {
$writer.WriteLine("ID1|ID2|ID3|ID4|ID5|ID6|Time|Time-UTC-Sec")
}
}
}
# Display the campaigns
$campaignByID.GetEnumerator() | Sort-Object Value
# Read in data file
$encoding = [Text.Encoding]::GetEncoding('iso-8859-1')
$datareader = New-Object IO.StreamReader($datafile, $encoding)
$datacounter = 0
echo "Starting.."
get-date -Format g
while (!$datareader.EndOfStream) {
$data = $datareader.ReadLine().Split('þ')
# Find the Campaign in the hashtable
$campaignName = $campaignByID[$data[3]]
if($campaignName) {
$writer = $campaignWriters[$campaignName]
# If a campaign name was returned from the hash, add the line using that campaign's writer
$writer.WriteLine(($data[20,3,5,8,12,14,0,19] -join '|'))
}
$datacounter++;
}
$datareader.Close()
foreach ($writer in $campaignWriters.Values) {
$writer.Close()
}
echo "Done!"
get-date -Format g
echo "Processed $datacounter total lines in the $datafile file"
Das Skript wird nicht wirklich ausgeführt, bis die letzte Zeile abgeschlossen ist. Verwenden Sie "done: $ (get-date -Format g)" zu sehen, wenn es genau passiert – Jimbo