VBScriptのメモリリークを根絶せよ:FSOを使いこなす「最適化」の極意
こんにちは。現場で長年VBScriptと向き合ってきた皆さんに、一つ問いたいことがあります。
「大量のファイルを処理していると、なぜかスクリプトが徐々に重くなり、しまいにはOSごと悲鳴を上げる……」
そんな経験はありませんか? それは、あなたが書いたコードがメモリを食いつぶす「ゾンビ」を大量生産しているからかもしれません。今日は、VBScriptの要であるFileSystemObject (FSO)を、メモリを無駄にせず、かつ高速に使い倒すための「職人の知恵」を伝授します。
—
1. なぜFSOは「ゾンビ」を生成するのか?
VBScriptは、厳密なメモリ管理をユーザーに委ねる言語です。特に`CreateObject(“Scripting.FileSystemObject”)`で生成したオブジェクトは、明示的に解放してあげないと、メモリ空間に「残骸」として残り続けます。
特に、数万回回るループの中で毎回インスタンスを生成すると、VBScriptのエンジンは「まだ使うかもしれない」と判断し、メモリを解放しません。これが、スクリプト実行時間が経つにつれて遅くなる最大の原因です。
—
2. 【アンチパターン】やってはいけないコード
まずは、多くの初心者が陥る「メモリリーク・コード」を見てみましょう。
‘ 【ダメな例】ループ内で毎回FSOを生成している
For i = 1 To 10000
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set file = fso.GetFile(“C:\Logs\test.txt”)
‘ ここで処理
‘ Set fso = Nothing を忘れている、あるいはループ内で生成しているのが致命的
Next
このコードの何が悪いか分かりますか?
1. ループのたびにOSへオブジェクト生成を要求する(オーバーヘッド大)
2. 生成したオブジェクトの参照が、前のループ分を上書きせずにメモリに蓄積される
—
3. 【最適解】リソースを極限まで絞り出す「再利用パターン」
プロの現場では、「オブジェクトのスコープ(生存範囲)をループの外に出す」のが鉄則です。FSO本体は一度だけ生成し、ループ内では「参照」のみを行います。
‘ 【最適解】オブジェクトの再利用とメモリ解放の徹底
Dim fso, folder, file
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ループの外で親となるオブジェクトを確保
Set folder = fso.GetFolder(“C:\Logs”)
For Each file In folder.Files
‘ ここでファイル処理を行う
‘ ファイルオブジェクト自体はループ内で生成・破棄が繰り返されるが、
‘ FSO本体は使い回すため、メモリ負荷が劇的に下がる
WScript.Echo file.Name
Next
‘ 最後にまとめて解放(後始末が美学)
Set file = Nothing
Set folder = Nothing
Set fso = Nothing
このコードが優れている理由:
- CreateObjectの呼び出しは1回のみ: OSの負荷を最小限に抑えます。
- メモリの安定性: オブジェクトの参照先を固定することで、ガベージコレクションが働きやすい環境を作ります。
- 明示的なNothing: スクリプト終了時に変数を解放することで、システムリソースを速やかにOSへ返却します。
—
4. プロの現場で役立つ「3つの鉄則」
現場でトラブルを防ぐために、この3つだけは今日から徹底してください。
1. FSOは「グローバル」で生成する
何度も言うようですが、`CreateObject`は重い処理です。関数の外やメイン処理の冒頭で一度だけ生成し、必要に応じて引数で渡すようにしましょう。
2. `Set obj = Nothing`は「おまじない」ではない
VBScriptが終了すればメモリは解放されますが、巨大なループ処理や長時間実行される常駐型スクリプトでは、`Nothing`による明示的な解放が「生存率」を左右します。
3. エラーハンドリングを忘れない
`On Error Resume Next`を多用しすぎないでください。FSOでファイルが開けない、権限がないといったエラーは、`If fso.FileExists(path) Then`のように事前チェックを挟むことで、スマートに回避するのがプロの流儀です。
—
まとめ:スクリプトを「作品」に変える
VBScriptは古い言語ですが、そのシンプルさゆえに「書き手の技量」がダイレクトに速度と安定性に直結します。
- ループ内で生成しない
- 使い終わったら確実にNothing
- 事前に存在確認を行う
この3ステップを意識するだけで、あなたの書くスクリプトは数万回のループにも耐えうる、堅牢なシステムへと進化します。
「動けばいい」コードから「美しく、かつ速い」コードへ。ここをクリアすれば、あなたはもうVBScriptの初心者ではありません。現場で頼られるエンジニアとしての第一歩を、今日踏み出してくださいね。
何かあれば、いつでも聞きに来てください。応援していますよ。
