MATLABで大きな .mat ファイルを扱うとき、こんなお悩みはありませんか?

  • ファイルサイズが大きすぎて、全体を処理しようとするとメモリが足りない
  • 必要な一部分だけ使いたいのに、全部ロードされてしまう
  • 処理が重くて作業効率が落ちる
  • 都度 clear で変数整理をしている

こうした場面で活躍するのが matfile 関数 です。

matfile を使うと、load 関数に比べて メモリ使用量を大幅に抑えることができます。
その理由は、データを一度メモリに展開するのではなく、.mat ファイルへ直接アクセスする仕組みになっているためだそうです。(公式リンク

今回は、関数matfileの動作を試してみました

※コードおよび動作確認の結果は、画像の後に記載しています


■ 実際に試してみる

MATLABに標準で用意されているサンプルデータを使って確認してみます。

今回は、.mat ファイル内の「特定の変数の一部分だけを取り出したい…」ケースを考えました。


load を使った場合

load を使うと、データの一部しか使わない場合でも ファイル全体がメモリに読み込まれます。

そのため、抽出処理の前段階で 大きなメモリ容量が必要になります。


matfile を使った場合

一方、matfile を使うと、

  • 必要な箇所だけを直接参照する
  • 主にに保持するのは抽出後のデータ

となるため、最小限のメモリで処理が可能です。


■ 添付画像のポイント

画像の whos の結果を見ると違いが分かります

  • load の場合
    → ファイル全体が読み込まれ、大きなメモリを消費しています
  • matfile の場合
    → 主な容量は参照オブジェクトのようです


■ おわりに

今回は、matfileを実際に使ってみてload関数と比較してみました。データサイズが大きな.matファイルを扱う際に試してみようかと思います!


今後も「MATLAB関数巡り」として、
実務で役立つ関数をご紹介できればと考えています!

MATLAB / LabVIEW関連の投稿をXやYoutubeでしています。
フォローしていただけますと幸いです。

X: https://x.com/SCISEL1990
YouTube:https://www.youtube.com/@scisel

関数loadの場合

clear

M = load('topography.mat');
M_topo_sub = M.topo(1:10,1:10);

whos

関数matfileの場合

clear

m = matfile('topography.mat');
m_topo_sub = m.topo(1:10,1:10);

whos