このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ファイルからメモリへのマッピング
簡単なメモリ マップの作成
関数 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 つのクラスにマッピングします。int16
、uint32
、single
に対してマッピングされます。
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'