【実務・中級編】【処理速度最適化】大量ファイル処理におけるFSOオブジェクト再生成の防止と文字列結合の高速化 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを極める:FSOと文字列連結の最適化で「爆速」処理を実現する

業務自動化の現場で、VBScriptは今なお強力な武器だ。だが、多くのエンジニアが「なぜかスクリプトが重い」「大量ファイル処理でフリーズする」という壁にぶつかる。その原因の9割は、オブジェクトのライフサイクル管理の無知と、メモリを食いつぶす文字列操作にある。

今日は、VBScriptで「プロフェッショナルな」自動化ツールを組むための、極限のパフォーマンスチューニング技術を伝授する。

—

1. アンチパターン:ループ内でのインスタンス生成

初心者がやりがちな最大の過ちは、ループの中で`CreateObject(“Scripting.FileSystemObject”)`を繰り返すことだ。

‘ 【絶対NG】ループ内で生成するな
For Each file In folder.Files
Set fso = CreateObject(“Scripting.FileSystemObject”) ‘ ここが重い!
‘ 処理…
Next

なぜこれが遅いのか

`CreateObject`は、レジストリ検索とCOMオブジェクトのインスタンス化という、OSにとって非常にコストの高い処理を伴う。数千ファイルの処理を行う場合、この「無駄な製造コスト」だけで実行時間は数倍に跳ね上がる。

解決策:インスタンスは「使い回せ」。
スクリプトの冒頭で一度だけ生成し、参照を保持し続けること。これがメモリの断片化を防ぎ、CPU負荷を最小化する唯一の道だ。

—

2. 文字列連結の罠:`&` 演算子を捨てる

次に陥るのが、大量のログやCSV出力を行う際の文字列結合だ。

‘ 【絶対NG】文字列の直接結合
strBuffer = strBuffer & newContent & vbCrLf

VBScriptの文字列型はイミュータブル(不変)である。`&` を使うたびに、メモリ上の新しい領域に「元の文字列+追加分」をコピーし直している。データが大きくなればなるほど、このコピーコストは指数関数的に増大し、処理は急激に鈍化する。

解決策:`Array` と `Join` 関数を使え。
一旦配列に格納し、最後に一括で結合する。これがVBScriptにおける「文字列操作の黄金律」だ。

—

3. 実践:プロダクションコード(保守性と高速化の両立)

以下に、大量ファイルの一括処理を想定した「高速・堅牢・保守的」なテンプレートを示す。これをベースにすれば、どんな業務量でも安定したパフォーマンスを発揮できるはずだ。

Option Explicit

‘ 実行の起点
Call Main()

Sub Main()
Dim fso, folder, file
Dim fileList()
Dim i

‘ 1. オブジェクト生成は1回のみ
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ フォルダ存在確認(堅牢な設計の基本)
If Not fso.FolderExists(“C:\TargetFolder”) Then Exit Sub

Set folder = fso.GetFolder(“C:\TargetFolder”)

‘ 配列の初期化(動的配列のサイズ設定)
ReDim fileList(folder.Files.Count – 1)

i = 0
For Each file In folder.Files
‘ 2. 処理を配列に溜め込む(& を使わない)
fileList(i) = “処理対象: ” & file.Name & ” | サイズ: ” & file.Size
i = i + 1
Next

‘ 3. 最後に一括出力(高速なJoin)
WScript.Echo Join(fileList, vbCrLf)

‘ 4. 明示的な開放
Set folder = Nothing
Set fso = Nothing
End Sub

—

4. 現場で生き残るための「プロの心得」

ファイルシステムへのアクセスは最小限に

FSOのメソッド(`GetFile`や`OpenTextFile`)は、ファイルシステムにI/Oを発生させる。ループ内で何度も同じプロパティを呼び出すのではなく、一度のアクセスで必要な情報を取得し、変数にキャッシュするクセをつけろ。

エラーハンドリングは不可欠

「堅牢なツール」とは、失敗する前提で設計されているものだ。
`On Error Resume Next` を闇雲に使うのは素人。必ず `Err.Number` をチェックし、失敗したファイル名をログに残すなどのトレース機能を持たせろ。

データベース連携の注意点

VBScriptからDBを叩く際は、必ずコネクションを閉じること。`Set conn = Nothing` を忘れると、サーバーサイドでセッションが残り続け、数日でシステムをダウンさせる原因になる。

—

まとめ

1. `CreateObject` はループの外へ出せ。
2. 文字列連結は `Join` 関数を使い、配列でバッファリングせよ。
3. I/Oアクセス回数を意識し、メモリへのキャッシュを徹底せよ。

VBScriptは古いが、その特性を理解した者が書いたコードは驚くほど速く、そして美しい。これが「動くもの」を作るエンジニアと、「運用し続けられる仕組み」を作るエンジニアの決定的な差だ。

さあ、コードをリファクタリングし、君のツールを真のプロダクションレベルへと引き上げろ。

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