Main Content

マッピングされたファイルへの書き込み

この例では、異なるメモリ マップを 3 つ作成してから、適切な構文を使用して各マップに書き込む方法を説明します。次に、マッピングされたデータのコピーを操作する方法を説明します。

MATLAB® ワークスペースの変数にアクセスするための MATLAB コマンドを使用して、ファイルに書き込むことができます。メモリ マップの Data プロパティにアクセスすることによって、マッピングされたファイルの内容は現在アクティブなワークスペースにある配列として表示されます。ファイルにデータを書き込むには、この配列のインデックスを指定します。マッピングされたメモリへの書き込みに使用する構文は、メモリ マップの Data プロパティの形式によって異なります。

数値配列としてマッピングしたメモリへの書き込み

最初に、現在のフォルダーに records.dat という名前のサンプル ファイルを作成します。

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

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

16 ビット符号なし整数のシーケンスとしてファイルをマップします。名前と値のペアの引数 Format を使用して、値を uint16 型に指定します。

m = memmapfile('records.dat', ...      
      'Offset',20,            ...
      'Format','uint16',      ...
      'Repeat',15);

ファイルは、単一のクラス (uint16) のシーケンスとしてマッピングされるため、Data は数値配列です。

マップされたファイルへの書き込み権限があることを確認します。メモリ マップ mWritable プロパティを true に設定します。

m.Writable = true;

Data プロパティと同じサイズの行列 X を作成し、ファイルのマッピングされた部分に書き込みます。メモリ マップを使用してデータに値を代入するときは、MATLAB の通常のインデックス付けとクラスのルールがすべて適用されます。代入先のクラスは、代入される値を保持するのに十分な大きさがなければなりません。

X = uint16(1:1:15);
m.Data = X;

X は、1 ~ 15 の範囲にある整数値の 1 行 15 列のベクトルです。

新しい値がファイルに書き込まれたことを確認します。ファイルの先頭から読み取りを開始するために、Offset 値に 0 を指定します。Repeat の値を 35 に指定して、合計 35 の値を表示します。関数 reshape を使用して、7 行 5 列の行列として値を表示します。

m.Offset = 0;
m.Repeat = 35;
reshape(m.Data,5,7)'
ans = 7x5 uint16 matrix

   47739   26762    4663   16362    3197
   24407   64575   16364   31612   40832
       1       2       3       4       5
       6       7       8       9      10
      11      12      13      14      15
   12673   53994   16337   46560   44024
   32781   16353   24667   24572   41957

X 内の値が、records.dat ファイルに書き込まれました。

スカラー構造体としてマッピングしたメモリへの書き込み

records.dat ファイルの領域を、フィールド名 x によって参照できる uint16 型の 300 行 8 列の行列でマッピングした後、フィールド名 y によって参照できる double 型の 200 行 5 列の行列でマッピングします。名前と値のペアの引数 Writable を使用して、マッピングされたファイルへの書き込み権限を指定します。

m = memmapfile('records.dat',     ...
      'Format', {                 ...
         'uint16' [300 8] 'x';    ...
         'double' [200 5] 'y' },  ...
      'Repeat', 1, 'Writable', true);

Data プロパティを表示します。

m.Data
ans = struct with fields:
    x: [300x8 uint16]
    y: [200x5 double]

Data は、スカラー構造体配列です。これは、records.dat ファイルが繰り返しのない複数のデータ型を含むものとしてマッピングされるためです。

フィールド x の行列を、すべて 1 の行列で置き換えます。

m.Data.x = ones(300,8,'uint16');

非スカラー構造体としてマッピングしたメモリへの書き込み

records.dat ファイルを uint16 型の 25 行 8 列の行列としてマッピングした後、double 型の 15 行 5 列の行列としてマッピングします。このパターンを 20 回繰り返します。

 m = memmapfile('records.dat',    ...
      'Format', {                ...
         'uint16' [5 4] 'x';    ...
         'double' [15 5] 'y' },  ...
      'Repeat', 20, 'Writable', true);

Data プロパティを表示します。

m.Data
ans=20×1 struct array with fields:
    x
    y

ファイルが複数のデータ型の繰り返しシーケンスとしてマッピングされているので、Data は非スカラー構造体配列です。

Data の 12 番目の要素の x という名前のフィールドに、すべて 1 の配列を書き込みます。

  m.Data(12).x = ones(5,4,'uint16');

Data の 12 番目の要素について、フィールド x の 3 行目から 5 行目までのすべての要素に値 50 を書き込みます。

  m.Data(12).x(3:5,1:end) = 50;

Data の 12 番目の要素のフィールド x を表示します。

m.Data(12).x
ans = 5x4 uint16 matrix

    1    1    1    1
    1    1    1    1
   50   50   50   50
   50   50   50   50
   50   50   50   50

マッピングされたファイルへの書き込みの構文

マッピングされたメモリへの書き込みに使用する構文は、メモリ マップの Data プロパティの形式によって異なります。メモリ マップのプロパティを表示するには、memmapfile オブジェクトの名前を入力します。

次の表では、行列 X をメモリ マップ m に書き込むときの構文を説明します。

Data プロパティの形式マッピングされたファイルへの書き込みの構文

数値配列

例: 15x1 uint16 array

m.Data = X;

スカラー (1 行 1 列) 構造体配列

例:

1x1 struct array with fields:
                x
                y

m.Data.fieldname = X;

fieldname はフィールド名です。

非スカラー (n 行 1 列) 構造体配列

例:

20x1 struct array with fields:
                x
                y

m.Data(k).fieldname = X;

k はスカラー インデックス、fieldname はフィールド名です。

X のクラスと X の要素数は、Data プロパティのそれらの値またはアクセス対象の Data プロパティのフィールドと一致しなければなりません。関数 memmapfile を使用してメモリ マップを作成した後、Data プロパティの次元を変更することはできません。たとえば、マッピングされた配列 m.Data に対して行の削除や追加を行って、配列のサイズを大きくしたり小さくしたりすることはできません。

ファイル全体をマッピングして、マップの作成後にそのファイルへデータを追加する場合、追加したデータはマッピング領域には含まれません。メモリ マップ m にマッピングされているデータの次元を変更する必要がある場合は、mFormat プロパティまたは Repeat プロパティを変更するか、関数 memmapfile を使用して m を作成し直さなければなりません。

メモ

マッピングされたファイルを正常に変更するには、そのファイルの書き込み権限が必要です。書き込み権限がない場合、Writable プロパティが true であってもファイルに書き込もうとするととエラーが発生します。

マッピングされたデータのコピーの操作

この例の部分では、マッピングされたデータのコピーを操作する方法を説明します。変数 d のデータは、m.Data(2) によってマッピングされたファイル データのコピーです。コピーであるため、d 内の配列データを変更しても、ファイルに含まれるデータは変更されません。

サンプル ファイル double.dat を作成します。

myData = rand([5000,1])*100;
fileID = fopen('double.dat','w');
fwrite(fileID,myData,'double'); 
fclose(fileID);

一連の double の行列として、ファイルをマッピングします。

m = memmapfile('double.dat',    ...
      'Format', {               ...	
         'double' [5 5] 'x';    ...
         'double' [4 5] 'y' });

m.Data(2).x の値を表示します。

m.Data(2).x
ans = 5×5

   95.0545   54.7696   15.6697   97.2605   85.0706
   53.2131   60.9054    5.8124   60.5319   25.6792
   24.7686   86.3135   33.9707   33.8236   28.5496
   43.7276   38.0696   81.7176   92.7984   77.9947
   66.9088   74.8956   37.7548   89.8425   70.1395

m.Data の内容を変数 d にコピーします。

d = m.Data;

コピーの x という名前のフィールドにすべて 0 を書き込みます。

d(2).x(1:5,1:5) = 0;

d(2).x に 0 が書き込まれたことを確認します。

d(2).x
ans = 5×5

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0

マッピングされたファイルのデータが変更されていないことを確認します。

m.Data(2).x
ans = 5×5

   95.0545   54.7696   15.6697   97.2605   85.0706
   53.2131   60.9054    5.8124   60.5319   25.6792
   24.7686   86.3135   33.9707   33.8236   28.5496
   43.7276   38.0696   81.7176   92.7984   77.9947
   66.9088   74.8956   37.7548   89.8425   70.1395

参考

関連するトピック