PowerShell Sort-Objectで処理を一度ためる流れの検証2/2

全2話で PowerShell で、複数のデータ(オブジェクト)を複数のコマンドレットで処理する際の、処理の流れについてプログラム実行して検証します。
データ全体に対して並び替えの処理を行う Sort-Object による処理の流れの違いについても検証します。

※ Windows PowerShell 5.1.19041.5965 を使用します。
※プログラムは自己責任でご利用ください。

前回の記事

前半では、パイプでつながった処理は、オブジェクト1つずつ順番に実行されることがわかりました。

今回は、このプログラムの中間の処理に Sort-Object コマンドレットを入れた場合の、処理の流れの変化について紹介します。

Sort-Object を中間に加えた処理の流れ

前回の、 Input, Output の後にパイプラインで渡されたオブジェクトの値を表示する処理の間に、 Sort-Object コマンドレットを下記の3行目に追加しました。

1, 3, 2 |
    ForEach-Object { Write-Host "Input: $_"; $_ } |
    Sort-Object |
    ForEach-Object { Write-Host "Output: $_" }

Sort-Object コマンドレットの前後の Write-Host で Input, Output で始まる文字列のあとに、| (パイプ)から渡された $_ 自動変数に格納されているオブジェクトの値の表示を行います。
※ Write-Host コマンドレットについては前半の記事を参照してください。

Sort-Object が逐次処理の場合の、処理の流れの推測

Sort-Object も前回の ForEach-Object, Write-Host コマンドレットとのように逐次処理だとすれば、

Input: 1
Output: 1
Input: 3
Output: 3
Input: 2
Output: 2

となりますが、 Sort-Object コマンドレット は、全てのオブジェクトをソートするために、上流の全てのオブジェクトを集めて処理するまで、処理を下流に渡しません

実際の結果は、Sort-Object で上流の全ての処理結果が集められる

実際に処理の流れを確認するため、先ほどのプログラムを Windows PowerShell アプリに貼り付けEnter キーを押して実行してみましょう。
※ Windows 10 の場合、エクスプローラアドレスバーpowershell⏎ と入力すると、そのフォルダをカレントディレクトリにして Windows PowerShell アプリを起動できます。

結果は、上流の全てのオブジェクト (1, 3, 2) の処理が Sort-Object コマンドレットの直前の Input から始まる表示処理が一括で行われ、その後、Sort-Object コマンドレットで並び替えた順番 (1, 2, 3) で1つずつ次の処理で Output から始まる表示処理が行われました。

PS G:\Dev\PowerShell> 1, 3, 2 |
>>     ForEach-Object { Write-Host "Input: $_"; $_ } |
>>     Sort-Object |
>>     ForEach-Object { Write-Host "Output: $_" }
Input: 1
Input: 3
Input: 2
Output: 1
Output: 2
Output: 3

このことからパイプラインは基本的に1個ずつ下流にオブジェクトを渡し処理を行いますが、 Sort-Object コマンドレットなど全てのオブジェクトを処理対象にするコマンドレットでは、上流からの全てのオブジェクトを一時的に保持することが推測できます。

powershell Sort-Object でいったん上流の全ての要素が処理されていったんためられます。2

Sort-Object はメモリ使用量に注意

Sort-Object コマンドレットのように、上流の処理結果を全て集める処理では、メモリ使用量注意が必要です。

power shellで複数CSVをソートし、重複しているレコードのリストを作成する
プログラムを作成しています。
sort-objectでソートを行う際に、メモリ使用量がほぼ100%となり
最終的にマシンにログインができなくなってしまっている状況です。

[Q&A] 大容量ファイルのソート時のメモリ不足の回避 – Qiita

Sort-Object コマンドレットの使用例

Sort-Object コマンドレットについては、以下の記事も参照してください。

まとめ

今回は全2話で、Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、複数のデータ(オブジェクト)を複数のコマンドレットで処理する際の、処理の流れについてプログラム実行して検証します。
データ全体に対して並び替えの処理を行う Sort-Object による処理の流れの違いについても検証します。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました