【極限の知見】AutoCAD大量図面変換パイプライン:メモリリークを制し、堅牢性を極める
数千、数万ものDWGファイルを扱うとき、AutoCAD VBAの標準的な実装は「自殺行為」に等しい。メモリの断片化、COMオブジェクトのゾンビ化、そして不可避な図面の破損。これらに直面した時、多くのエンジニアは「ツールが悪い」と嘆くが、真実は開発者の理解不足にある。
今日は、レガシー環境を生き抜き、数万ファイルの変換を完遂させるための「設計思想と実装」の核心を共有する。
—
1. アーキテクチャの鉄則:VBAから「外」を制御する
VBA単体で数千の図面を`Open`し続けるのは、メモリ管理の観点から見て愚策だ。AutoCADのプロセスは、開閉を繰り返すごとにGDIリソースやメモリを食いつぶし、やがて強制終了する。
極限の解:
VBAは「コントローラー」に徹し、処理の実体は`ObjectARX`または`VB.NET`で構築するのが理想だが、VBAで完結させるならば「プロセス分離」が必須だ。一定数(例えば50ファイル)処理するごとに、一度AutoCADプロセスを再起動(タスクキル)し、メモリをクリーンな状態にリセットするパイプラインを組め。
—
2. 堅牢な自動変換パイプラインの実装例
以下は、ファイルリストを読み込み、バージョン変換とエラーログ出力を制御する基幹コードの骨子である。
‘ 堅牢な変換パイプラインの核となるプロシージャ
Public Sub ExecuteBatchMigration(ByVal fileList As Collection)
Dim doc As AcadDocument
Dim i As Long
On Error GoTo ErrorHandler
For i = 1 To fileList.Count
‘ メモリ肥大化対策:定期的な再起動フラグを判定
If i Mod 50 = 0 Then ResetAutoCADProcess
Set doc = Documents.Open(fileList(i), False) ‘ 読み取り専用で開くのが鉄則
‘ 指定バージョン(例: ACAD2018)で保存
doc.SaveAs fileList(i), ac2018_dwg
‘ オブジェクトの明示的解放(重要)
doc.Close False
Set doc = Nothing
‘ GCを促すための小休止(Windows API Sleepを使用)
Sleep 500
Next i
Exit Sub
ErrorHandler:
LogToFile “Error occurred at file: ” & fileList(i) & ” | Err: ” & Err.Description
Resume Next ‘ エラーを握りつぶさずログに刻み、次へ進む
End Sub
—
3. メモリ解放の「真実」:VBAはゴミを掃除しない
VBAの`Set obj = Nothing`は、単なる参照の切断であり、背後のCOMオブジェクトが即座に解放されるとは限らない。特に`ThisDrawing.ModelSpace`や`ActiveDocument`への過度な依存は、オブジェクトの生存期間を不必要に延長させる。
- 参照を局所化せよ: プロシージャレベルで宣言し、スコープを抜ける前に必ず`Nothing`にする。
- Windows API `EmptyWorkingSet`の活用:
大規模処理のループの合間に、以下のAPIを呼び出すことで物理メモリをOSへ強制返還できる。これを実装しているか否かで、数時間後の安定性が劇的に変わる。
‘ メモリ開放用API宣言
Private Declare Function EmptyWorkingSet Lib “psapi.dll” (ByVal hProcess As LongPtr) As Long
Private Declare Function GetCurrentProcess Lib “kernel32” () As LongPtr
Public Sub ForceMemoryCleanup()
EmptyWorkingSet GetCurrentProcess()
End Sub
—
4. レガシー環境を生き抜く:システム管理者への提言
数万件の処理を行う際、最も恐れるべきは「図面内の外部参照(XREF)の未解決」や「プロキシオブジェクトの警告」によるダイアログのポップアップだ。これらはパイプラインを即座に停止させる。
1. システム変数制御: `FILEDIA`, `CMDDIA`, `PICKFIRST`を強制的に`0`に設定し、ダイアログを抑制する。
2. 検証の自動化: ファイルを開く前に、Windowsのファイル属性や、ヘッダーのバイナリチェック(DWGバージョンIDの先頭数バイト)を行うことで、破損しているファイルを未然にスキップする前処理を入れるべきだ。
3. 再開機能の設計: 処理済みファイルリストをCSVまたはデータベースで逐次更新せよ。システムがクラッシュしても、中断位置から数秒で復帰できることが、大規模運用の最低条件である。
—
最後に:エンジニアとしての矜持
VBAは枯れた技術ではない。適切な設計と、OSリソースへの深い洞察さえあれば、現代のどの最新ツールよりも高速かつ軽量に、現場の課題を解決する強力な武器となる。
「動けばいい」という考えは捨てろ。「10万回繰り返しても、何一つリソースをこぼさない」。そのレベルの設計を突き詰めた先にこそ、真の業務自動化の扉が開かれる。
諸君、コードを信じ、メモリを監視し、そして何より、システムを飼い慣らせ。
