大きなCSVファイル(4GB +)を読み取り、特定の行を見つけて、その行を他のファイルに書き込むPowerShell scriptがあります。終了後のPowerShellメモリの消去
スクリプトの最後の行である$ datafileファイルの "$ echo"処理された$ datacounter行が気になるのですが、実際には5-10分後に終了しません。
この期間は何をしていますか?終了すると、メモリ使用量が大幅に減少します。スクリプトの最後にメモリをクリアする方法はありますか?ここで
Screenshot of script timestamps
参照のための私のスクリプトの最終版です。
# 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"
最後の行が完了するまでスクリプトは実際には実行されません。 "done:$(get-date -Format g)"を使用して、正確に起こるか確認してください – Jimbo