Main Content

memmapfile

ファイルに対するメモリ マップの作成

説明

m = memmapfile(filename) は、既存のファイル filename をメモリにマップし、メモリ マップ m を返します。

メモリ マッピングとは、ディスク上のファイルの一部または全体を、MATLAB® のアドレス空間内の一定のメモリ アドレス範囲にマッピングするメカニズムです。これによって MATLAB は、ディスク上のファイルに対し、動的メモリへと同様にアクセスできるようになり、ファイルの読み取りと書き込みが高速化されます。メモリ マッピングにより、ファイル内のデータを MATLAB 配列であるかのように扱えます。

m = memmapfile(filename,Name,Value) は、1 つ以上の名前と値のペアの引数を使用して m のプロパティを指定します。たとえば、ファイルのデータ形式を指定できます。

すべて折りたたむ

コマンド プロンプトで、現在のフォルダーに 10 個の uint8 値を含むサンプル ファイル records.dat を作成します。

myData = uint8(1:10)';

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

records.dat のマップを作成します。memmapfile を使用する場合、既定のデータ形式は uint8 です。そのため、この場合には、必要な入力引数はファイル名だけです。

m = memmapfile('records.dat')
m = 

    Filename: 'd:\matlab\records.dat'
    Writable: false
      Offset: 0
      Format: 'uint8'
      Repeat: Inf
        Data: 10x1 uint8 array

MATLAB は records.dat ファイル全体をメモリにマップし、メモリ マップのすべてのプロパティを既定値に設定します。メモリ マップは変数 m に割り当てられます。この例では、コマンドは、ファイル全体を符号なし 8 ビット整数の列としてマップし、さらに、呼び出し側にその内容への読み取り専用のアクセスを与えます。

mData プロパティにアクセスして、マップされたデータを表示します。

m.Data
ans =

    1
    2
    3
    4
    5
    6
    7
    8
    9
   10

倍精度データのメモリ マップを作成します。構文は、その他のデータ型を指定する場合と同様です。

コマンド プロンプトで、現在のフォルダーに 10 個の double 値を含むサンプル ファイル records.dat を作成します。

myData = (1:10)';

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

records.dat のメモリ マップを作成し、出力の Format プロパティを 'double' に設定します。

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

memmapfile の m は次のプロパティを含みます。FilenameWritableOffsetFormatRepeatData。任意の 1 つのプロパティ、たとえば Format を表示するには、コマンド ウィンドウに m.Format と入力します。

m.Format
ans = 
'double'

Data プロパティには、records.dat の 10 個の倍精度値が格納されています。

int32 データの大きな配列のメモリ マップを作成します。書き込みアクセスを指定し、既定値以外の Format 値と Offset 値を設定します。

コマンド プロンプトで、現在のフォルダーに 10,000 個の int32 値を含むサンプル ファイル records.dat を作成します。

myData = int32([1:10000]);

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

records.dat のメモリ マップを作成し、出力の Format プロパティを int32 に設定します。さらに、ファイルの最初の 9000 バイトを無視するように Offset プロパティを設定し、書き込みアクセスを許可するように Writable プロパティを設定します。

m = memmapfile('records.dat',...
               'Offset',9000,...
               'Format','int32',...
               'Writable',true);

9000Offset 値は、records.dat の最初の 9000 バイトがマップされないことを示しています。

メモリ マップの名前を入力して、すべてのプロパティの現在の設定を表示します。

m
m =
    Filename: 'd:\matlab\records.dat'
    Writable: true
      Offset: 9000
      Format: 'int32'
      Repeat: Inf
        Data: 7750x1 int32 array

Format プロパティは、メモリ マップによる読み取りまたは書き込み操作はいずれも、ファイルの内容を符号付き 32 ビット整数のシーケンスとして読み書きすることを示しています。Data プロパティには、7750 個の要素しか格納されていません。これは、ファイルの最初の 2250 個の値を表す records.dat の最初の 9000 バイトがマップされないからです。

mData プロパティにアクセスして、マップされたデータの最初の 5 つの要素を表示します。

m.Data(1:5)
ans =

        2251
        2252
        2253
        2254
        2255

100 個の倍精度値を含むファイルの領域のメモリ マップを作成します。

コマンド プロンプトで、現在のフォルダー に、100 個の倍精度値を含むサンプル ファイル mybinary.bin を作成します。

rng('default')
randData = rand([100,1]);

fileID = fopen('mybinary.bin','w');
fwrite(fileID,randData,'double');
fclose(fileID);

mybinary.bin の最初の 75 個の値を、フィールド名 x を使用してメモリ マップの構造体で参照できる、5×5×3 の倍精度値の配列にマップします。名前と値のペアの引数 Format を使用して以下のパラメーターを指定します。

m = memmapfile('mybinary.bin',...
               'Format',{'double',[5 5 3],'x'})
m = 

    Filename: 'd:\matlab\mybinary.bin'
    Writable: false
      Offset: 0
      Format: {'double' [5 5 3] 'x'}
      Repeat: Inf
        Data: 1x1 struct array with fields:
                x

Data プロパティは、マップされた値をフィールド x に含む構造体配列です。

マップされたデータを変数 A に割り当てます。Data プロパティは構造体配列なので、データにアクセスするにはフィールド x にインデックスを付けなければなりません。

A = m.Data.x;

A に関する情報を表示します。

whos A
  Name      Size             Bytes  Class     Attributes

  A         5x5x3              600  double                       

さまざまな配列形状とデータ型を含むファイルのセグメントをメモリにマップします。

コマンド プロンプトで、現在のフォルダーにサンプル ファイル mybinary.bin を作成します。サンプルの圧力、温度およびボリューム値を表す uint16 データと倍精度データをファイルに書き込みます。この場合、各 uint16 配列は 50 行 1 列で、倍精度配列は 5行 10 列です。k はサンプルのスケーリング ファクターです。

rng('default')
k = 8.21;
pres1 = randi([1,300],[50,1],'uint16');
temp1 = randi([1,300],[50,1],'uint16');
vol1 = double(reshape(k*temp1./pres1,5,10));
pres2 = randi([5,500],[50,1],'uint16');
temp2 = randi([5,500],[50,1],'uint16');
vol2 = double(reshape(k*temp2./pres2,5,10));

fileID = fopen('mybinary.bin','w');
fwrite(fileID,pres1,'uint16');
fwrite(fileID,temp1,'uint16');
fwrite(fileID,vol1,'double');
fwrite(fileID,pres2,'uint16');
fwrite(fileID,temp2,'uint16');
fwrite(fileID,vol2,'double');
fclose(fileID);

一意の名前でアクセスできる配列にファイルをマップします。50 行 1 列 の uint16 値の配列を含むフィールド pressure を定義し、その後に 50 行 1 列 の uint16 値の配列を含むフィールド temperature を定義します。5 行 10 列の倍精度値の配列を含むフィールド volume を定義します。cell 配列を使用してマップ領域の形式を定義し、このパターンを 2 回繰り返します。

m = memmapfile('mybinary.bin',...
'Format',{'uint16',[50 1],'pressure';...
'uint16',[50,1],'temperature';...
'double',[5,10],'volume'},'Repeat',2)
m = 

    Filename: 'd:\matlab\mybinary.bin'
    Writable: false
      Offset: 0
      Format: {'uint16' [50 1] 'pressure'
               'uint16' [50 1] 'temperature'
               'double' [5 10] 'volume'}
      Repeat: 2
        Data: 2x1 struct array with fields:
         pressure
      temperature
           volume

メモリ マップ mData プロパティは、Format が 2 回適用されるため、2 行 1 列の構造体配列になります。

Data プロパティを変数 A にコピーします。次に、double データの最後のブロックを表示します。このブロックには、フィールド名 volume を使用してアクセスできます。

A = m.Data;
myVolume = A(2).volume
myVolume =

     2    13    32     5     5    16     4    22     3     8
     2     9    53    38    13    19    23    85     2   120
    29    10     6     1     2     5     6    58    20    11
     7    15     4     1     5    18     1     4    14     8
     9     8     4     2     0     9     8     6     3     3

入力引数

すべて折りたたむ

ファイル拡張子を含む、マップするファイルの名前。文字ベクトルまたは string スカラーとして指定します。filename 引数にワイルドカード文字 (*? など) を含めることはできません。

例: 'myFile.dat'

データ型: char | string

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: m = memmapfile('myFile.dat','Format','int32','Offset',255) は、ファイル myFile.datint32 データを 256 番目のバイトから開始するメモリにマップします。

書き込み権限。true または false として指定します。false を指定すると、マップ領域は読み取り専用になります。true を指定すると、マップ領域に対する読み取りと書き込みの両方の権限が付与されます。

例: 'Writable',true

データ型: logical

ファイルの先頭からマップ領域の先頭までの距離。非負の整数として指定します。この値は 0 ベースで、値 0 はファイルの先頭を表します。

例: 'Offset',1024

データ型: double

マップ領域の形式。文字ベクトル、string スカラー、または n 行 3 列の cell 配列として指定します。

マップする領域に 1 つのデータ型のみが含まれている場合、Format の値にはそのデータ型を示す文字ベクトルまたは string スカラーを指定します。たとえば、データが 16 ビット符号付き整数のみの場合は 'int16' を指定します。Format の値を指定する際には、次のデータ型が使用できます。

  • 'int8'

  • 'int16'

  • 'int32'

  • 'int64'

  • 'uint8'

  • 'uint16'

  • 'uint32'

  • 'uint64'

  • 'single'

  • 'double'

マップする領域でマップされるファイルのデータに対する配列の形状とこの配列を参照するフィールド名を指定する必要がある場合、Format 値を 1 行 3 列の cell 配列として指定します。

  • 最初の cell の値として、マップ領域に適用するデータ型を割り当てる文字ベクトルまたは string スカラーを指定します。

  • 2 番目の cell の値として、マップ領域に適用する配列の次元を割り当てる 1 行 n 列の配列を指定します。

  • 3 番目の cell の値として、メモリ マップの Data 構造体配列で使用するフィールド名を割り当てる文字ベクトルまたは string スカラーを指定します。たとえば、{'uint64',[30 4 10],'x'} のようになります。

マップする領域がさまざまなデータ型または配列の形状のセグメントから構成されている場合、n 行 3 列の cell 配列の行を使用して各セグメントの形式を指定できます。例: {'uint64',[30 4 10],'x'; 'uint32',[30 4 6],'y'}

データ型: char | string | cell

マップ領域への Format パラメーターの適用回数。Inf または正の整数として指定します。Inf を指定すると、memmapfile はファイルの最後まで Format パラメーターを適用します。

例: 'Repeat',2000

データ型: double

出力引数

すべて折りたたむ

メモリ マップ。以下のプロパティをもつ memmapfile オブジェクトとして返されます。

プロパティ説明

Filename

マップされたファイルのパスと名前

Writable

マップ領域で許可されるアクセス タイプ

Offset

ファイルの先頭からマップされた領域の先頭までのバイト数

Format

マップされた領域のコンテンツの形式。データ型、配列サイズ、データへのアクセスに使用するフィールド名などを含む

Repeat

Format プロパティで指定されたパターンをファイルのマップされた領域に適用する回数

Data

ファイルからメモリにマップされたデータ。DataFormat プロパティで指定されたフィールド名をもつ数値配列または構造体配列

Data 以外のプロパティの値はすべて、memmapfile の呼び出し時に名前と値のペアの引数により設定されます。

m プロパティには構造体配列フィールドへのアクセス同様、ドット表記を使ってアクセスします。たとえば、Data プロパティのメモリにマップされたデータにアクセスするには、次のいずれかを実行します。

  • Data が数値配列の場合は、m.Data を呼び出します。

  • Data がスカラー (1 行 1 列) 構造体配列の場合は、m.Data.fieldname を呼び出します。ここで、fieldname はフィールドの名前です。

  • Data が非スカラー構造体配列の場合は、m.Data(index).fieldname を呼び出します。ここで、index は構造体配列の要素のインデックス、fieldname はフィールドの名前です。たとえば、Data の最初の要素の temperature フィールドのファイル データにアクセスするには、m.Data(1).temperature を呼び出します。

メモリ マップ m の作成後、Data 以外のすべてのプロパティの値は変更できます。新しい値を割り当てるには、ドット表記を使用します。たとえば、m に新しい Offset 値を設定するには、次のように入力します。

m.Offset = 2048;

ヒント

  • 既存のファイルのみマップできます。新しいファイルを作成して、そのファイルを一度の操作でメモリにマップすることはできません。このファイルのメモリへのマップを行う前に、MATLAB ファイル I/O 関数を使用してファイルを作成してください。

  • 関数 memmapfile がファイルの位置を特定すると、MATLAB はファイルの絶対パス名を内部に保存します。そして、以降のこのファイルの位置の特定にはこの保存されたパスを使用します。これにより、現在の作業ディレクトリ以外のディレクトリで作業しながら、マップされたファイルへのアクセスを保てます。

  • memmapfile では、マップされたファイルに対する拡張や追加は行われません。代わりに、fopenfwrite のような標準ファイル I/O 関数を使用してください。

アルゴリズム

MATLAB アドレス空間へのファイルの実際のマッピングは、memmapfile オブジェクトを作成する際には実行されません。メモリ マップは、マッピングされたオブジェクトに現在格納されている情報に基づいており、そのオブジェクトの Data プロパティを最初に参照または変更したときに生成されます。

バージョン履歴

R2006a より前に導入