【入門編】【メモリリーク回避】ループ処理内で大量のFSOオブジェクトを生成・破棄する際のリソース最適化術 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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の初心者ではありません。現場で頼られるエンジニアとしての第一歩を、今日踏み出してくださいね。

何かあれば、いつでも聞きに来てください。応援していますよ。

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