mcpField
M
matlab-optimize-memory

matlab-optimize-memory

github.com/matlab開発1.2k71 回インストール1 日前に更新
リポジトリ

matlab-optimize-memory について

matlab-optimize-memory は、MATLAB プログラムのメモリ使用量を診断・削減する7段階のスキルです。まず測定とプロファイリングを行い、対象を絞って変更した後、結果の正しさを確認します。

主な機能

  1. 01メモリ使用量の基準測定
  2. 02メモリ割り当てのプロファイリング
  3. 03一般的な割り当てパターンの特定
  4. 04対象を絞った最適化の適用
  5. 05再測定と正確性の検証
  6. 06メモリ変化の報告

活用シーン

  1. 01MATLAB のメモリ不足エラーの調査
  2. 02大規模データ処理時のメモリ削減
  3. 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 を参照してください。

パターン典型的な削減効果確認する箇所
セル配列への収集と vertcatO(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:結果を報告する

ベースライン、最適化後の値、削減率、正しさの確認、および適用したパターンを含めて、メモリ最適化の結果を要約します。

重要なルール

  1. ソースコードを読むだけで最適化を提案しないでください — 必ず最初に測定とプロファイリングを行います
  2. 正しさを検証してください — メモリ最適化後も結果が同一である必要があります
  3. 変数は早めにクリアしてください — データが不要になったらすぐにメモリを解放します
  4. 配列の拡張を避けてください — 事前割り当てするか、セル配列に収集します
  5. 式を分割してください — 順次代入は、連鎖式と比べてピークメモリを削減します
  6. コピーに注意してください — MATLAB は書き込み時にコピーするため、変数を再利用して重複を避けます

プラットフォームに関する注意

  • Windows: memory コマンドは完全な統計情報(MemUsedMATLAB など)を返します
  • Linux/macOS: memory はエラーになります(「このプラットフォームではサポートされていません」)。変数サイズの確認には whos、ヒープ使用量の確認には Java の Runtime.getRuntime、または system('ps ...') を介した OS レベルの RSS を使用してください
  • profile -memory: すべてのプラットフォームで動作しますが、R2016a 以降は非公開です。利用できない場合は、関数呼び出しの前後で whos のスナップショットを取得してください。

Copyright 2026 The MathWorks, Inc.

コメント