VBScriptで「メモリの沼」に沈まないために。巨大配列の完全解放術を伝授します
こんにちは。現場で長年自動化スクリプトを書いてきたエンジニアです。
VBScriptを触り始めると、誰もが一度はぶつかる壁があります。「あれ?スクリプトを動かし続けると、PCの動作がどんどん重くなるぞ?」という現象です。
実は、VBScriptが動く環境(WSH)は、メモリ管理が現代の言語ほど賢くありません。特に「数百万件のデータを処理する」ような巨大な配列を扱うとき、ただ`Set obj = Nothing`とするだけでは、OSにメモリがなかなか返還されないのです。
今日は、VBScriptにおける「メモリの掃除術」、特に巨大配列の完全解放について、現場レベルの知見をお伝えします。
—
なぜVBScriptでメモリが解放されないのか?
VBScriptのメモリ管理は、基本的に「参照カウンタ」という仕組みに依存しています。しかし、配列(特に`ReDim`で拡張を繰り返した動的配列)は、メモリ上で非常に厄介な振る舞いをすることがあります。
スクリプトが「使わなくなったはずのメモリ」を握りしめたまま放さないと、システム全体のパフォーマンスが低下し、最悪の場合はスクリプトがクラッシュします。これを防ぐのが、今回紹介する「EraseとReDimの合わせ技」です。
—
【鉄則】配列を「ゼロの箱」に戻す手順
単に`Erase`を呼ぶだけでは、配列のヘッダ情報が残ってしまうことがあります。確実にメモリの開放を促すには、以下の「儀式」を覚えてください。
実践コード:巨大配列の完全解放パターン
‘ 巨大な配列を生成・使用し、その後安全に解放する例
Sub ProcessHugeData()
‘ 1. 動的配列の宣言
Dim dataArray()
‘ 2. メモリを確保(数百万件の想定)
ReDim dataArray(1000000)
‘ … ここでデータの処理を行う …
‘ 処理内容:dataArray(i) = “Payload”
‘ 3. 【最重要】メモリの解放フェーズ
‘ まずEraseで要素を消去する
Erase dataArray
‘ 次に、ReDim Preserveで極小サイズに再定義してメモリを削ぎ落とす
‘ これにより、OSに対して「このメモリ領域はもう不要です」という強いシグナルを送る
ReDim dataArray(0)
‘ 最後にNothingを代入してオブジェクトとしての寿命を全うさせる
‘ (配列変数の場合はEraseで十分なことも多いが、念には念を)
WScript.Echo “メモリ解放完了。安全に次の処理へ進めます。”
End Sub
コードの解説
1. `Erase dataArray`: 配列内のすべての要素を破棄します。ただし、内部的なメモリ領域の確保状態が完全にOSに戻されるとは限りません。
2. `ReDim dataArray(0)`: ここがプロの知恵です。サイズ0の配列として再定義することで、確保していた巨大なメモリブロックをOSに返還させ、最小限のメモリ消費量まで絞り込みます。
3. 明示的解放: VBScriptにおいて明示的な`Nothing`の代入は、COMオブジェクトに対しては必須ですが、配列のような組み込み型に対しても、後続の処理でメモリを再利用しないことを明示する意味で有効です。
—
陥りやすいエラーと注意点
1. 「Subscript out of range」エラー
`Erase`した後、その配列を再度使おうとすると「添字が範囲外です」というエラーが出ます。解放した直後にデータにアクセスしていないか、フラグ管理を徹底しましょう。
2. 再代入の罠
`ReDim Preserve` を乱用していませんか?`Preserve`は「データを保持したままサイズを変える」ため、内部で新しいメモリを確保し、古いデータをコピーし、古いメモリを破棄するという「重い処理」を裏で行っています。巨大な配列に対してこれを繰り返すと、断片化(メモリフラグメンテーション)の原因になります。
—
先輩エンジニアからのアドバイス
VBScriptを使いこなすコツは、「メモリを使い捨ての消耗品のように扱わないこと」です。
- 小さなデータなら変数で。
- 巨大なデータなら、処理が終わるたびに必ずEraseとReDimで掃除する。
- 長時間稼働するスクリプトなら、メイン処理を関数(Sub/Function)に切り出し、変数のスコープを限定する。
関数が終了すれば、その中で宣言された変数は自動的に解放の対象となります。巨大な配列を扱うときは、一つの長いコードに書くのではなく、必要な処理が終わったら即座に関数を抜ける設計にすると、驚くほど安定しますよ。
ここさえ押さえれば、VBScriptのメモリ管理はもう完璧です!ぜひ、あなたの自動化ツールで試してみてくださいね。何か詰まったら、いつでも聞きに来てください!
