matlab.io.Datastore 클래스

패키지: matlab.io

기본 데이터저장소 클래스

설명

matlab.io.Datastore는 사용자 지정 데이터저장소를 만들기 위한 추상 클래스입니다. 데이터저장소는 특히 데이터가 너무 커서 메모리에 맞지 않을 때, 반복적으로 대규모의 데이터 모음에 액세스하는 데 도움을 줍니다. Datastore 추상 클래스는 MATLAB®에서 모든 사용자 지정 데이터저장소에 예상되는 인터페이스를 선언하고 캡처합니다. 다음 구문을 사용하여 클래스를 파생시킵니다.

classdef MyDatastore < matlab.io.Datastore
    ...
end

사용자 지정 데이터저장소를 구현하려면 다음을 수행하십시오.

  • 클래스 matlab.io.Datastore에서 상속

  • 네 가지 필수 메서드, hasdata, read, reset, progress 정의

사용자 지정 데이터저장소를 만들기 위한 자세한 내용 및 단계를 보려면 Develop Custom Datastore 항목을 참조하십시오.

메서드

read

데이터저장소에서 데이터를 읽습니다.

[data,info] = read(ds)

data 출력값은 모든 데이터형이 될 수 있고 세로로 결합 가능해야 합니다. 모범 사례는 info 출력값을 구조체로 반환하는 것입니다.

출력 data의 데이터형에 따라 tall 함수의 출력 데이터형이 달라집니다.

Access: Public, Abstract: true

hasdata

데이터를 읽을 수 있는지 확인합니다. 출력값은 논리형입니다.

tf = hasdata(ds)

Access: Public, Abstract: true

reset

임의의 데이터를 읽기 전에 데이터저장소를 초기 상태로 재설정합니다.

reset(ds)

Access: Public, Abstract: true

progress

이미 읽은 데이터의 양을 확인합니다.

출력값은 01 사이의 double형 스칼라입니다. 반환값 0.5555%의 데이터를 읽었음을 의미합니다.

p = progress(ds)

Access: Public, Abstract: true, Hidden:true

preview

데이터의 서브셋을 반환합니다.

data = preview(ds)

디폴트 구현에서는 데이터의 처음 8개 행을 반환합니다. 출력값의 데이터형은 read의 출력값과 같습니다.

preview 메서드의 디폴트 구현은 tall형 배열을 생성하는 데 최적화되어 있지 않습니다. tall형 배열의 성능을 향상하려면 사용자의 데이터를 기반으로 구현을 최적화하십시오.

Access: Public

readall

데이터저장소의 모든 데이터를 읽습니다.

data = readall(ds)

출력값의 데이터형은 read의 출력값과 같습니다. 데이터가 메모리에 맞지 않으면 readall이 오류를 반환합니다.

readall 메서드의 디폴트 구현은 tall형 배열을 생성하는 데 최적화되어 있지 않습니다. tall형 배열의 성능을 향상하려면 사용자의 데이터를 기반으로 구현을 최적화하십시오.

Access: Public

속성

핸들 속성을 사용자 지정 데이터저장소에 추가하려면 copyElement 메서드를 구현해야 합니다. 예를 들어, DsFileSet 객체를 사용자 지정 데이터저장소에서 속성으로 사용한 경우 copyElement 메서드를 구현해야 합니다. copyElement 메서드를 구현하면 datastore 객체의 깊은 복사를 생성할 수 있습니다. 자세한 내용은 Customize Copy Operation 항목을 참조하십시오. copyElement 메서드 구현 예는 Develop Custom Datastore 항목을 참조하십시오.

특성

Sealedfalse

클래스 특성에 대한 자세한 내용은 클래스 특성 항목을 참조하십시오.

예제

모두 축소

사용자 지정 데이터나 사유 데이터를 직렬로 처리하기 위해 MATLAB®으로 가져올 수 있도록 데이터저장소를 만듭니다.

사용자 지정 데이터저장소를 구현하는 코드를 포함하는 .m 클래스 정의 파일을 만듭니다. 이 파일은 작업 폴더나 MATLAB® 경로에 있는 폴더에 저장해야 합니다. .m 파일의 이름은 객체 생성자 함수의 이름과 동일해야 합니다. 예를 들어, 생성자 함수가 MyDatastore 이름을 가지려고 하면 .m 파일의 이름이 MyDatastore.m이어야 합니다. .m 클래스 정의 파일은 다음 단계를 포함해야 합니다.

  • 1단계: datastore 클래스에서 상속합니다.

  • 2단계: 생성자와 필수 메서드를 정의합니다.

  • 3단계: 사용자 지정 파일 읽기 함수를 정의합니다.

이외에도 데이터를 처리하고 분석하는 데 필요한 다른 속성이나 메서드도 정의합니다.

%% STEP 1: INHERIT FROM DATASTORE CLASSES
classdef MyDatastore < matlab.io.Datastore
    
    properties(Access = private)
        CurrentFileIndex double
        FileSet matlab.io.datastore.DsFileSet
    end
    
    % Property to support saving, loading, and processing of
    % datastore on different file system machines or clusters.
    % In addition, define the methods get.AlternateFileSystemRoots()
    % and set.AlternateFileSystemRoots() in the methods section. 
    properties(Dependent)
        AlternateFileSystemRoots
    end
    
    
%% STEP 2: DEFINE THE CONSTRUCTOR AND THE REQUIRED METHODS
    methods
        % Define your datastore constructor
        function myds = MyDatastore(location,altRoots)
            myds.FileSet = matlab.io.datastore.DsFileSet(location,...
                'FileExtensions','.bin', ...
                'FileSplitSize',8*1024);
            myds.CurrentFileIndex = 1;
             
            if nargin == 2
                 myds.AlternateFileSystemRoots = altRoots;
            end
            
            reset(myds);
        end
        
        % Define the hasdata method
        function tf = hasdata(myds)
            % Return true if more data is available
            tf = hasfile(myds.FileSet);
        end
        
        % Define the read method
        function [data,info] = read(myds)
            % Read data and information about the extracted data
            % See also: MyFileReader()
            if ~hasdata(myds)
                error(sprintf(['No more data to read.\nUse the reset ',... 
                     'method to reset the datastore to the start of ' ,...
                     'the data. \nBefore calling the read method, ',...
                     'check if data is available to read ',...
                     'by using the hasdata method.'])) 
            end
            
            fileInfoTbl = nextfile(myds.FileSet);
            data = MyFileReader(fileInfoTbl);
            info.Size = size(data);
            info.FileName = fileInfoTbl.FileName;
            info.Offset = fileInfoTbl.Offset;
            
            % Update CurrentFileIndex for tracking progress
            if fileInfoTbl.Offset + fileInfoTbl.SplitSize >= ...
                    fileInfoTbl.FileSize
                myds.CurrentFileIndex = myds.CurrentFileIndex + 1 ;
            end
        end
        
        % Define the reset method
        function reset(myds)
            % Reset to the start of the data
            reset(myds.FileSet);
            myds.CurrentFileIndex = 1;
        end

        % Getter for AlternateFileSystemRoots property
        function altRoots = get.AlternateFileSystemRoots(myds)
            altRoots = myds.FileSet.AlternateFileSystemRoots;
        end

        % Setter for AlternateFileSystemRoots property
        function set.AlternateFileSystemRoots(myds,altRoots)
            try
              % The DsFileSet object manages the AlternateFileSystemRoots
              % for your datastore
              myds.FileSet.AlternateFileSystemRoots = altRoots;

              % Reset the datastore
              reset(myds);  
            catch ME
              throw(ME);
            end
        end
    end
    
    methods (Hidden = true)          
        % Define the progress method
        function frac = progress(myds)
            % Determine percentage of data read from datastore
            if hasdata(myds) 
               frac = (myds.CurrentFileIndex-1)/...
                             myds.FileSet.NumFiles; 
            else 
               frac = 1;  
            end 
        end
    end
    
    methods(Access = protected)
        % If you use the  FileSet property in the datastore,
        % then you must define the copyElement method. The
        % copyElement method allows methods such as readall
        % and preview to remain stateless 
        function dscopy = copyElement(ds)
            dscopy = copyElement@matlab.mixin.Copyable(ds);
            dscopy.FileSet = copy(ds.FileSet);
        end
                
    end
end

%% STEP 3: IMPLEMENT YOUR CUSTOM FILE READING FUNCTION
function data = MyFileReader(fileInfoTbl)
% create a reader object using FileName
reader = matlab.io.datastore.DsFileReader(fileInfoTbl.FileName);

% seek to the offset
seek(reader,fileInfoTbl.Offset,'Origin','start-of-file');

% read fileInfoTbl.SplitSize amount of data
data = read(reader,fileInfoTbl.SplitSize);

end

이제 사용자 지정 데이터저장소를 사용할 준비가 되었습니다. MyDatastore를 사용하여 이진 데이터 파일을 읽을 수 있는 datastore 객체를 만듭니다.

직렬 처리용 사용자 지정 데이터저장소를 사용하여 사유 데이터를 MATLAB에서 미리 보고 읽을 수 있습니다.

이 예제에서는 간단한 데이터 세트를 사용하여 사용자 지정 데이터저장소를 사용하는 워크플로를 보여줍니다. 데이터 세트는 각 파일이 한 개 열(1개 변수)과 10000개 행(레코드)의 부호 없는 정수로 구성된, 15개의 이진(.bin) 파일 모음입니다.

dir('*.bin')
binary_data01.bin  binary_data05.bin  binary_data09.bin  binary_data13.bin  
binary_data02.bin  binary_data06.bin  binary_data10.bin  binary_data14.bin  
binary_data03.bin  binary_data07.bin  binary_data11.bin  binary_data15.bin  
binary_data04.bin  binary_data08.bin  binary_data12.bin  

MyDatastore 함수를 사용하여 datastore 객체를 생성합니다. MyDatastore의 구현 세부 정보는 이진 파일을 읽을 데이터저장소 생성하기 예제를 참조하십시오.

folder = fullfile('*.bin'); 
ds = MyDatastore(folder); 

데이터저장소에서 데이터를 미리 봅니다.

preview(ds)
ans = 8x1 uint8 column vector

   113
   180
   251
    91
    29
    66
   254
   214

while 루프에서 데이터를 읽고 hasdata 메서드를 사용하여 더 읽을 데이터가 있는지 확인하십시오.

while hasdata(ds)
    data = read(ds);
    % do something
end

데이터저장소를 초기 상태로 다시 설정하고 데이터저장소 시작부터 데이터를 읽습니다.

reset(ds);
data = read(ds);

또는 데이터 수집이 메모리에 다 담긴다면 데이터저장소에 있는 모든 데이터를 읽습니다. 폴더는 각 파일에 10000개의 레코드가 들어 있는 15개 파일을 포함하므로, 출력 크기는 150000개 레코드가 됩니다.

dataAll = readall(ds);
whos dataAll
  Name              Size             Bytes  Class    Attributes

  dataAll      150000x1             150000  uint8              

Windows® 컴퓨터에서 사용자 지정 datastore 객체를 만들고 저장한 다음, Linux® 컴퓨터에서 해당 객체를 불러오고 처리합니다.

사용자 지정 데이터저장소를 만들고 저장하기 전에, 다른 플랫폼에 있는 데이터의 루트 경로를 확인합니다. 루트 경로는 컴퓨터나 파일 시스템에 따라 달라집니다. 예를 들어, 다음과 같은 루트 경로를 사용하여 데이터에 액세스할 수 있습니다.

  • 로컬 Windows 컴퓨터의 "Z:\DataSet"

  • Linux 클러스터의 "/nfs-bldg001/DataSet"

AlternateFileSystemRoots 속성을 사용하여 위와 같은 루트 경로를 연결해야 합니다. MyDatastore의 구현 세부 정보는 Build Datastore to Read Binary Files 예제를 참조하십시오.

altRoots = ["Z:\DataSet","/nfs-bldg001/DataSet"];
ds = MyDatastore('Z:\DataSet\*.bin',altRoots);

데이터저장소 내의 파일을 검토합니다.

fileTbl = resolve(ds.Fileset);
fileTbl.FileName
ans =

  12×1 cell array

    {'Z:\DataSet\binary_data01.bin'}
    {'Z:\DataSet\binary_data02.bin'}
    {'Z:\DataSet\binary_data03.bin'}
      .
      . 
      .

데이터저장소를 저장합니다.

save ds_saved_on_Windows.mat ds

Linux 플랫폼에서 데이터저장소를 불러오고 데이터저장소 내의 파일을 검토합니다. 불러올 때 Linux 클러스터에서 루트 경로 'Z:\DataSet'에 액세스할 수 없으므로, datastore 함수는 AlternateFileSystemRoots 속성에 지정된 값을 기준으로 루트 경로를 자동으로 업데이트합니다.

load ds_saved_on_Windows.mat
fileTbl = resolve(ds.Fileset);
fileTbl.FileName
ans =

  12×1 cell array

    {'/nfs-bldg001/DataSet/binary_data01.bin'}
    {'/nfs-bldg001/DataSet/binary_data02.bin'}
    {'/nfs-bldg001/DataSet/binary_data03.bin'}
      .
      . 
      .
이제 Linux 컴퓨터에서 이 데이터저장소를 처리하고 분석할 수 있습니다.

R2017b에 개발됨