matlab-optimize-memory について
matlab-optimize-memory は、MATLAB プログラムのメモリ使用量を診断・削減する7段階のスキルです。まず測定とプロファイリングを行い、対象を絞って変更した後、結果の正しさを確認します。
主な機能
- 01メモリ使用量の基準測定
- 02メモリ割り当てのプロファイリング
- 03一般的な割り当てパターンの特定
- 04対象を絞った最適化の適用
- 05再測定と正確性の検証
- 06メモリ変化の報告
活用シーン
- 01MATLAB のメモリ不足エラーの調査
- 02大規模データ処理時のメモリ削減
- 03MATLAB コードの割り当て箇所の特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-optimize-memoryインストール後、Claude Code で/matlab-optimize-memoryを入力して読み込まれたか確認します。
同梱ファイルmanifest.yamlreferences/memory-patterns.md
詳細
MATLAB のメモリ最適化ワークフロー
MATLAB コードのメモリのボトルネックを特定して解消する、体系的な 7 ステップのワークフローです。
使用する場合
- MATLAB コードの実行中にメモリ不足エラーが発生する
- MATLAB プログラムのメモリ使用量を削減したい
- メモリ不足にならずに、より大きなデータセットを処理したい
- メモリ割り当てをプロファイルまたは測定したい
使用しない場合
- ボトルネックがメモリではなく実行速度にある場合(
matlab-optimize-performanceを使用してください) - メモリの問題が、M コードレベルで変更できないコンパイル済み C/MEX コードにある場合
- メモリ使用量の大部分が I/O バッファー(メモリマップファイル、データベース接続)による場合
7 ステップのワークフロー
ステップ 1:メモリのベースラインを確立する
変更を加える前に、現在のメモリ使用量を測定します。
m0 = memory;
targetFunction(inputs);
m1 = memory;
deltaBytes = m1.MemUsedMATLAB - m0.MemUsedMATLAB;
fprintf('Memory delta: %.2f MB\n', deltaBytes / 1e6);
memory でエラーが発生する場合(Linux/macOS)は、変数サイズの確認に whos を使用するか、ヒープの確認に Java ランタイムを使用します。
info = whos('result');
fprintf('Variable size: %.2f MB\n', info.bytes / 1e6);
ステップ 2:メモリ割り当てをプロファイルする
メモリがどこで割り当てられているかを特定します。
profile('-memory', 'on');
for iter = 1:5
targetFunction(inputs);
end
profile off;
p = profile('info');
ft = p.FunctionTable;
[~, idx] = sort([ft.TotalMemAllocated], 'descend');
for i = 1:min(15, numel(idx))
f = ft(idx(i));
fprintf('%-40s %10.2f MB\n', f.FunctionName, f.TotalMemAllocated/1e6);
end
TotalMemAllocated フィールドがゼロの場合は、各関数呼び出しの前後で whos のスナップショットを取得してください。
注目すべきポイント:
- 「Allocated」が大きく「Freed」が小さい関数 — メモリが保持されています
- 中程度の割り当てを伴う関数が何度も呼び出される — 合計すると大きくなります
- 「Allocated」と「Freed」の差が大きい — 一時データが蓄積しています
ステップ 3:最適化の機会を特定する
プロファイリングの結果に基づき、該当するパターンを特定します。コード例については references/memory-patterns.md を参照してください。
| パターン | 典型的な削減効果 | 確認する箇所 |
|---|---|---|
セル配列への収集と vertcat | O(N²) → O(N) | ループ内の [arr; newRow] |
repmat ではなく暗黙的拡張 | 配列全体のコピーを排除 | ブロードキャストのための repmat(A, [1 1 K]) |
| 不要になった変数をクリア | 直ちにメモリを解放 | 初期のステップでのみ使用される大きな配列 |
| 連鎖式を分割 | ピーク時の一時データを 1 つ削減 | a.*b.*c./d がすべて同時に存在 |
| 変数を再利用(上書き) | 出力の割り当てを回避 | 各ステップで別々の変数を使用 |
マスキングではなく max/min | 論理配列の一時データを排除 | x .* (x > 0) のパターン |
zeros(...,'like',x) | 一時データを排除 | ゼロ配列の作成に 0 * x を使用 |
| コピーオンライトによる共有 | バッキングメモリを共有 | 同じ配列を複数の場所に代入 |
| 密行列 → 疎行列 | O(N²) → O(N·bw) | N > 10000 の場合の zeros(N,N) |
ステップ 4:最適化を実装する
特定したパターンを適用します。ステップ 2 で特定したホットスポットだけに絞り、あらゆる箇所にパターンを適用しないでください。
ステップ 5:最適化後のメモリを測定する
ステップ 1 と同じ方法で再測定します。
m0 = memory;
optimizedFunction(inputs);
m1 = memory;
deltaOpt = m1.MemUsedMATLAB - m0.MemUsedMATLAB;
reduction = 1 - deltaOpt / deltaBytes;
fprintf('Optimized: %.2f MB (%.0f%% reduction)\n', deltaOpt/1e6, reduction*100);
ステップ 6:正しさを検証する
すべての最適化で、同じ結果が得られる必要があります。
original = originalFunction(inputs);
optimized = optimizedFunction(inputs);
maxErr = max(abs(original(:) - optimized(:)));
fprintf('Max error: %.2e\n', maxErr);
assert(maxErr < 1e-10, 'Results differ!');
ステップ 7:結果を報告する
ベースライン、最適化後の値、削減率、正しさの確認、および適用したパターンを含めて、メモリ最適化の結果を要約します。
重要なルール
- ソースコードを読むだけで最適化を提案しないでください — 必ず最初に測定とプロファイリングを行います
- 正しさを検証してください — メモリ最適化後も結果が同一である必要があります
- 変数は早めにクリアしてください — データが不要になったらすぐにメモリを解放します
- 配列の拡張を避けてください — 事前割り当てするか、セル配列に収集します
- 式を分割してください — 順次代入は、連鎖式と比べてピークメモリを削減します
- コピーに注意してください — MATLAB は書き込み時にコピーするため、変数を再利用して重複を避けます
プラットフォームに関する注意
- Windows:
memoryコマンドは完全な統計情報(MemUsedMATLABなど)を返します - Linux/macOS:
memoryはエラーになります(「このプラットフォームではサポートされていません」)。変数サイズの確認にはwhos、ヒープ使用量の確認には Java のRuntime.getRuntime、またはsystem('ps ...')を介した OS レベルの RSS を使用してください profile -memory: すべてのプラットフォームで動作しますが、R2016a 以降は非公開です。利用できない場合は、関数呼び出しの前後でwhosのスナップショットを取得してください。
Copyright 2026 The MathWorks, Inc.