プログラム 技術

PowerShellのファイル処理時メモリ削減方法

PowerShellで容量の大きなファイル(1ファイルあたり500MB)などを扱う際に扱いに気を付けないとメモリを圧迫し、マシンの性能を著しく低下させてしまいます。そこで、今回はPowerShellでファイル操作する際のメモリの消費を減らす方法の紹介となります

名前バージョン
OSWindows 11 Pro
PowerShell7.4.5

今回は検証用として164 MBのCSVファイルを対象としています

ファイルを読み込む場合

Get-Contentの場合

変数に格納する場合

以下のようにした場合のメモリの使用量を確認したいと思います

$CSVdata = Get-Content $inputfile -Encoding utf8BOM
foreach($row in $CSVdata) {
    Write-Host $row
}

対象処理前

対象処理後(メモリをめちゃ食っていることがわかる)

変数に格納しない場合

以下のようにした場合のメモリの使用量を確認したいと思います

Get-Content $inputfile -Encoding utf8BOM | ForEach-Object {
    Write-Host $_
}

対象処理前

対象処理後

Import-Csvの場合

変数に格納する場合

以下のようにした場合のメモリの使用量を確認したいと思います

$CSVdata = Import-Csv $inputfile -Encoding utf8BOM
foreach($row in $CSVdata) {
    Write-Host $row
}

対象処理前

対象処理後(メモリをめちゃ食っていることがわかる)

変数に格納しない場合

以下のようにした場合のメモリの使用量を確認したいと思います

Import-Csv $inputfile -Encoding utf8BOM | ForEach-Object {
    Write-Host $_
}

対象処理前

対象処理後

最後に

この結果を見るとPowerShellで処理する際は変数にデータを格納するよりも都度処理の方がパフォーマンスが良いことが改めて確認できました
また、今回は記載していませんが書き出す際も同様に変数に格納するのではなくパイプラインでつないだりした方がメモリの消費は少ないと思います

会社紹介

私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています

会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造

この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています

ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します

ホームページ
アドバンスド・ソリューション株式会社
アドバンスド・ソリューション株式会社

アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...

サイトへ移動

-プログラム, 技術
-