5

私はpowershellを初めて使用しますが、windows2003サーバーで実行されるいくつかのスクリプトを作成しました. これは間違いなく cmd スクリプトよりも強力です (プログラミングのバックグラウンドがあるためかもしれません)。しかし、さらに掘り下げていくと、次のことに気付きました。

  1. 起動された各スクリプトは、1 つの powershell プロセスの下で実行されます。スクリプトごとに新しい powershell プロセスが表示されます。
  2. 私がメモリについてテストしたスクリプトは非常に単純です。たとえば、文字列を作成するか、環境変数をクエリしてから、Start-Sleep を 60 秒間実行するだけなので (メモリ使用量に関しては) 何も必要ありません。ただし、各プロセスには約30MB以上かかります。私をケチと呼んでください、しかし、毎日実行するようにスケジュールされたメモリ集約型のアプリケーションがあり、いくつかのPowerShellスクリプトを定期的に実行するようにスケジュールする必要がある場合、そしておそらくいくつかのスクリプトをサービスとして継続的に実行するようにスケジュールする必要がある場合、私は確かにメモリ消費をできるだけ維持しようとします.できるだけ低く。<-- これは、メモリ不足による大規模なアプリケーション障害が最近発生したためです。

私はまだ C# に触れていませんが、タスクを C# で記述した方がよい場合があると考える人はいますか?

一方、powershell のメモリ リークに関する投稿を見てきました。スクリプトによって作成されたメモリはpowershellのプロセス空間内にあると考えるのは正しいので、スクリプトが終了するとpowershellが終了すると、作成されたメモリはクリアされますか?

4

3 に答える 3

5

1 - はい、新しいプロセスが作成されます。cmd スクリプト、vb スクリプト、または C# コンパイル済み実行可能ファイルを実行する場合も同様です。

2 - PowerShell ホストとランタイムをロードすると、かなりの量のメモリが必要になります。これは、システムやバージョンによって異なります。これは通常、cmd シェルや専用の C# exe よりも重いプロセスになります。これらの MB では、Powershell を非常に強力にする豊富なランタイムとライブラリのサポートを利用できます。

一般的なコメント:

  • OS はプロセスごとにメモリを割り当てます。プロセスが終了すると、そのメモリはすべて回収されます。これは、最新の OS の一般的な設計であり、Powershell や Windows に固有のものではありません。
  • チームがハードウェア上でビジネス クリティカルなアプリケーションを実行していて、30MB の少数のプロセスが壊滅的な障害を引き起こす可能性がある場合、より大きな問題が発生します。ブラウザーを開いて Facebook にアクセスすると、それよりも多くのメモリが消費されます。
  • いくつかの難解なバッチ スクリプト ソリューションを理解するのにかかる時間内に、Powershell でより優れたソリューションを作成できる可能性があり、会社は新しい専用ハードウェアを購入して、請求可能な時間を節約できます :-)
  • 作業に最も適したツールを使用する必要があります。多くの場合、 Powershell は適切なツールですが、常にそうとは限りません。Windows 環境での管理タスク (ファイル処理、AD の操作、スケジュールされたタスク、アクセス許可の設定など) を自動化するのに最適です。高性能で高度にアルゴリズム化されたタスクや、未加工の .NET API に対する複雑なコーディングにはあまり適していません。これらのタスクには、C# の方が理にかなっています。
  • Powershell は、Microsoft (および大規模なユーザー コミュニティ) からの多大な支援/サポートを受けており、今後の Windows で推奨されるスクリプト環境であることが非常に明確になりました。Windows 用のすべての新しいサーバー側技術は、powershell をサポートしています。管理者や IT 部門で働いている場合は、Powershell のスキルを身につけることは賢明な投資です。C# の学習を思いとどまらせることは決してありませんが、あなたの役割が開発よりも IT に関連している場合は、Powershell が適切なツールであることが多くなり、同僚もそれを理解する可能性が高くなります。
于 2012-09-05T20:55:50.303 に答える
5

私の PowerShell.exe 2.0 自体 (スクリプトを実行していない) は、XP で ~30MB です。これは、最近のマシンあたりの平均メモリを気にする必要はありません。メモリ リークに関しては、オブジェクトが適切に破棄されない場合にメモリ リークが発生するサード パーティのライブラリを使用するケースがありました。それらに対処するには、手動でガベージ コレクターを呼び出す必要がありますが[gc]::Collect()、これはまれです。Get-Contentまた、非常に大きなファイルを読み取り、それを使用する前に変数に代入している人を見たこともあります。これも大量のメモリを消費します。その場合、パイプラインを使用してファイルの一部を一度に読み取ることで、メモリ フットプリントを削減できます。

于 2012-09-05T20:39:00.617 に答える