Main Content

memmapfile

파일에 대한 메모리 맵(Memory Map) 생성

설명

예제

m = memmapfile(filename)은 기존 파일 filename을 메모리에 매핑하고 메모리 맵 m을 반환합니다.

메모리 매핑은 디스크에 있는 파일의 일부분이나 파일 전체를 MATLAB® 주소 공간 내 특정 범위의 메모리 주소로 매핑하는 메커니즘입니다. 그러면 MATLAB은 동적 메모리에 액세스하는 것과 같은 방식으로 디스크에 있는 파일에 액세스할 수 있습니다. 따라서 파일 읽기와 쓰기 속도가 빨라집니다. 메모리 매핑을 사용하면 마치 MATLAB 배열을 사용하는 것처럼 파일의 데이터를 작업할 수 있습니다.

예제

m = memmapfile(filename,Name,Value)는 하나 이상의 이름-값 쌍의 인수를 사용하여 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 mFilename, Writable, Offset, Format, Repeat, Data 속성을 포함합니다. 어느 한 속성을 표시하려면 , 예로 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);

Offset9000records.dat의 처음 9000바이트가 매핑되지 않음을 나타냅니다.

메모리 맵의 이름을 입력하여 모든 속성의 현재 설정을 확인합니다.

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

Format 속성은 메모리 맵을 통해 수행되는 모든 읽기 작업이나 쓰기 작업이 파일 내용을 일련의 부호 있는 32비트 정수로 읽거나 쓴다는 것을 나타냅니다. 파일의 처음 2,250개 값을 나타내는 records.dat의 처음 9000바이트가 매핑되지 않았으므로 Data 속성에는 7,750개의 요소만 들어 있습니다.

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);

고유한 이름으로 액세스할 수 있는 배열에 파일을 매핑합니다. uint16형 값으로 구성된 50×1 배열이 포함된 필드 pressure를 정의한 다음, 50×1 uint16형 값이 포함된 필드 temperature를 정의합니다. 배정밀도 값으로 구성된 5×10 배열이 포함된 필드 volume을 정의합니다. 셀형 배열을 사용하여 매핑된 영역의 형식을 정의하고 패턴을 두 번 반복합니다.

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

Format이 두 번 적용되므로, 메모리 맵 mData 속성은 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 셀형 배열로 지정됩니다.

매핑하려는 영역에 한 가지 유형의 데이터만 포함되어 있으면 Format 값을 그 유형을 식별하는 문자형 벡터 또는 string형 스칼라로 지정합니다. 예를 들어, 데이터에 부호 있는 16비트 정수만 포함되어 있으면 'int16'을 지정합니다. Format 값을 지정할 때 다음 데이터형 중 하나를 사용할 수 있습니다.

  • 'int8'

  • 'int16'

  • 'int32'

  • 'int64'

  • 'uint8'

  • 'uint16'

  • 'uint32'

  • 'uint64'

  • 'single'

  • 'double'

매핑하려는 영역이, 매핑되는 파일의 데이터에 대한 배열 형태 및 배열을 참조하기 위한 필드 이름을 지정할 것을 필요로 하는 경우 Format 값을 1×3 셀형 배열로 지정하십시오.

  • 문자형 벡터 또는 string형 스칼라로 지정된 첫 번째 셀 값은 매핑된 영역에 적용할 데이터형을 할당합니다.

  • 1×n 배열로 지정된 두 번째 셀 값은 매핑된 영역에 적용할 배열 차원을 할당합니다.

  • 문자형 벡터 또는 string형 스칼라로 지정된 세 번째 셀 값은 메모리 맵으로 구성된 Data 구조체형 배열에서 사용할 필드 이름을 할당합니다. 예: {'uint64',[30 4 10],'x'}

매핑하려는 영역이 다양한 데이터형이나 배열 형태를 가진 세그먼트로 구성된 경우 n×3 셀형 배열을 사용하여 각 세그먼트의 형식을 지정할 수 있습니다. 예를 들면 {'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은 매핑된 파일을 확장하거나 매핑된 파일에 추가하지 않습니다. 대신 fopen, fwrite와 같은 표준 파일 I/O 함수를 사용하십시오.

알고리즘

memmapfile 객체를 생성할 때는 파일을 MATLAB 주소 공간에 실제로 매핑하는 동작이 발생하지 않습니다. 이 객체의 Data 속성을 처음으로 참조하거나 수정할 때, 매핑된 객체에 현재 저장되어 있는 정보를 기반으로 하여 메모리 맵이 생성됩니다.

버전 내역

R2006a 이전에 개발됨

참고 항목