Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ファイルからメモリへのマッピング

簡単なメモリ マップの作成

関数 memmapfile を使用して、ファイル records.dat のメモリ マップを作成するとします。

5000 個の値をもつサンプル ファイル records.dat を作成します。

rng('default')
myData = rand([5000,1]);

fileID = fopen('records.dat','w');
fwrite(fileID, myData,'double');
fclose(fileID);

次に、メモリ マップを作成します。Format の名前と値のペアの引数を使用して、値を double 型に指定します。Writable の名前と値のペアの引数を使用して、マップ領域への書き込みアクセスを許可します。

m = memmapfile('records.dat', ...
      'Format', 'double',     ...
      'Writable', true)
m = 

    Filename: 'd:\matlab\records.dat'
    Writable: true
      Offset: 0
      Format: 'double'
      Repeat: Inf
        Data: 5000x1 double array

MATLAB®memmapfile オブジェクト m を作成します。Format プロパティは、マップ領域への読み取りおよび書き込み動作でファイル内のデータを倍精度数値のシーケンスとして処理することを指定します。Data プロパティには、ファイル records.dat の 5000 個の値が格納されています。メモリ マップ m の作成後、Data 以外のすべてのプロパティの値を変更できます。

たとえば、メモリ マップ m の開始位置を変更します。Offset プロパティの値を変更して、ファイルの先頭からマップ領域の 1024 バイト目で開始します。

m.Offset = 1024
m = 

    Filename: 'd:\matlab\records.dat'
    Writable: true
      Offset: 1024
      Format: 'double'
      Repeat: Inf
        Data: 4872x1 double array

メモリ マップのプロパティ値を変更するたびに、MATLAB はファイルをメモリにマッピングし直します。Data プロパティには現在、4872 個の値のみが含まれています。

マッピングしたデータの形式の指定

既定の設定により、MATLAB では、マッピングされたファイルのすべてのデータが符号なし 8 ビット整数のシーケンスであると見なされます。ただし、実際のデータのデータ型が異なる場合があります。関数 memmapfile を呼び出すときに、Format の名前と値のペアの引数を使用して、別のデータ型を指定します。Format の値は、マップ領域全体で使用する単一クラスを指定する文字ベクトルにすることも、複数のクラスを指定する cell 配列にすることもできます。

長さが 12 KB のファイルをマッピングするとします。このファイルから読み取るデータは、6,000 個の 16 ビット (2 バイト) 整数または 1,500 個の 8 バイト倍精度浮動小数点数のシーケンスとして扱うことができ、他にもさまざまな可能性があります。また、このデータを異なる型の組み合わせとして読み取ることもできます。たとえば、4,000 の 8 ビット (1 バイト) 整数の後に 1,000 の 64 ビット (8 バイト) 整数を続けることもできます。マッピングされたデータを MATLAB で解釈する方法を決定するには、関数 memmapfile を呼び出すときにメモリ マップの Format プロパティを設定します。

MATLAB 配列は列優先の順序でディスクに保存されます。配列要素のシーケンスは列 1 行 1、列 1 行 2、列 1 最終行、列 2 行 1 などのように続きます。メモリ マップによって読み取りや書き込みを行う際には、配列要素の順序の転置や並べ替えが必要となる場合があります。

複数のデータ型と配列のマッピング

マッピングする領域がデータ型または配列形状が異なるセグメントで構成されている場合、セグメントごとに形式を指定できます。Format の名前と値のペアの引数の値を n 行 3 列の cell 配列として指定します。n はセグメント数です。cell 配列内の各行はセグメントに対応します。行の最初のセルは、マッピングされたセグメントに適用するデータ型を指定します。2 番目のセルには、セグメントに適用する配列の次元が含まれます。3 番目のセルには、そのセグメントを参照するためのフィールド名が含まれます。メモリ マップ m の場合、次の構文を使用します。

m = memmapfile(filename,                             ...
            'Format', {                              ...
               datatype1, dimensions1, fieldname1;   ...
               datatype2, dimensions2, fieldname2;   ...
                   :          :            :         ...
               datatypeN, dimensionsN, fieldnameN})

長さが 40,000 バイトのファイルがあるとします。次のコードは、2048 バイト目からデータをマッピングします。Format の値は 3 行 3 列の cell 配列であり、ファイル データを次の 3 つのクラスにマッピングします。int16uint32single に対してマッピングされます。

m = memmapfile('records.dat',        ...
      'Offset', 2048,                ...
      'Format', {                    ...
         'int16'  [2 2] 'model';     ...
         'uint32' [1 1] 'serialno';  ...
         'single' [1 3] 'expenses'});

この例の memmapfile は、int16 データを 2 行 2 列の行列としてマッピングします。この行列には、フィールド名 model を使用してアクセスできます。uint32 データはスカラー値であり、フィールド名 serialno を使用してアクセスします。single データは、expenses という名前の 1 行 3 列の行列です。これらの各フィールドは、800 行 1 列の構造体配列 m.Data に属します。

次の図では、サンプル ファイルのマッピングを説明します。

次の図では、配列要素の順序をさらに詳しく説明します。特に、MATLAB 配列は列優先の順序でディスクに保存されていることがわかります。マッピングされたファイルにおける配列要素のシーケンスは、行 1 列 1、行 2 列 1、行 1 列 2、および行 2 列 2 となります。

ファイルのデータがこの順序で保存されていない場合、メモリ マップによって読み取りや書き込みを行う際には、配列要素の順序の転置または並べ替えを行わなければならない場合があります。

マッピングするファイルの選択

memmapfile オブジェクトを作成した後は、いつでも Filename プロパティの値を変更できます。これは、次のような場合に有用です。

  • 複数のファイルで同じ memmapfile オブジェクトを使用する。

  • memmapfile オブジェクトを MAT ファイルに保存してから、マッピングしたファイルが別の場所に移された環境で MATLAB に読み戻す。この場合、新しい場所を表すように Filename のパスの部分を変更する必要があります。

ドット表記を使用して、メモリ マップの Filename プロパティ内のパスを更新します。たとえば、メモリ マップ m の新しいパス f:\testfiles\records.dat を指定するには、次のように入力します。

m.Filename = 'f:\testfiles\records.dat'

参考

関連するトピック