2012-09-05 28 views
5

私はpowershellを初めて使っていますが、windows2003サーバ上で実行されるいくつかのスクリプトを書きました。それは間違いなくcmdスクリプトよりも強力です(おそらく私がプログラミングの背景を持っているためです)。しかし、さらに掘り下げると、次のように気付きました。Powershellのメモリ使用量 - 高価ですか?

  1. 各スクリプトの起動は1回のpowershellプロセスで実行されます。 各スクリプトに対して新しいPowerShellプロセスが表示されます。
  2. 私がメモリのためにテストしたスクリプトは、 文字列を作成するか、または環境変数をクエリしてから、秒のStart-Sleepを作成するというように、とてもシンプルです。しかし、各プロセスには約30MBを超える が必要です。ひどいと思いますが、メモリを大量に使用しているため、毎日実行する予定のアプリケーションは です。 定期的に実行するpowershellスクリプトと、スクリプトとして実行するスクリプト をサービスとして継続的に実行する予定です。メモリ の消費量はできるだけ少なくしてください。 < - これは最近、 がメモリ不足のために大きなアプリケーションのエラーを経験したためです。

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

一方、私はpowershellのメモリリークに関する記事を見てきました。スクリプトによって作成されたメモリがpowershellのプロセス空間にあると思うのは当然です。そうすれば、スクリプトが終了してpowershellが終了すると、作成されたメモリはクリアされますか?

+0

質問を編集して再現可能なケース、つまりサンプルスクリプト、起動方法の詳細、メモリ使用量の決定方法などを編集すると、PS専門家に役立ちます。がんばろう。 – shellter

答えて

4

私自身PowerShell.exe 2.0(スクリプトを実行していない)は、XPでは約30MBです。これは、最近、マシンごとの平均メモリを心配する必要はありません。メモリリークに関しては、オブジェクトが適切に処分されていない場合にメモリリークのあるサードパーティライブラリを使用するケースがあります。それらに対処するには、[gc]::Collect()を使用して手動でガベージコレクタを起動する必要がありますが、これはまれです。他の回私は人々がGet-Contentを使用して非常に大きなファイルを読み取り、それを使用する前にそれを変数に割り当てるのを見ました。これはまた、多くのメモリを消費します。この場合、パイプラインを使用して一度にファイルの部分を読み取って、メモリフットプリントを減らすことができます。

+1

PowerShellは、作業をストリーミングするとき、つまり一度に1つの項目を操作し、後で使用するために変数にすべての項目を格納しないとき(この回答で指摘されているように)に最も効率的に機能します。ストリーミングシナリオでも、-AutoSizeパラメーターを指定して、Sort-Object、Group-Object、Format-Tableなどのストリームできない特定のコマンドレットを監視する必要があります。 –

+0

@KeithHillはその性質上、Keithが言及した種類のコマンドレットの種類のため、パイプラインから処理する前にすべてのデータを受け取る必要があるため、Get-Contentが一度にファイルの部分を処理できたとしても'Sort-Object'のようなコマンドレットは、メモリエラーを発生させる可能性のあるすべての着信データをバッファリングする必要があります。 –

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のサポートがあります。あなたがadmin/ITで働いているなら、Powershellでいくつかのスキルを磨くことが賢明な投資になるでしょう。誰かがC#を学ぶのをやめさせることは決してありませんが、あなたの役割が開発者よりもITなら、Powershellはもっと頻繁に正しいツールになり、同僚は理解しやすくなります。
+0

大きなポインタ! –