Main Content

カスタム データストアの開発

このトピックでは、ファイルベースのデータ用のカスタム データストアを実装する方法を説明します。このフレームワークは、独自のカスタム データストア インターフェイスを記述する場合にのみ使用します。それ以外の場合で、イメージやスプレッドシートなどの標準ファイル形式を扱うときは、MATLAB® から既存のデータストアを使用します。詳細については、データストア入門を参照してください。

概要

独自のカスタム データストア インターフェイスを作成するには、カスタム データストア クラスおよびオブジェクトを使用します。次に、このカスタム データストアを使用して MATLAB にデータを読み込み、tallmapreduce、Hadoop® などの MATLAB のビッグ データ機能を利用します。

独自のカスタム データストアを設計する場合は、1 つ以上の抽象クラスから継承し、必須のメソッドを実装します。必要となる具体的なクラスおよびメソッドは処理のニーズによって異なります。

処理のニーズ

クラス

MATLAB での逐次処理のためのデータストア

matlab.io.Datastore

逐次処理のためのデータストアの実装を参照してください。

Parallel Computing Toolbox™ および MATLAB Parallel Server™ をサポートするデータストア

matlab.io.Datastorematlab.io.datastore.Partitionable

並列処理のサポートの追加を参照してください。

Hadoop をサポートするデータストア

matlab.io.Datastorematlab.io.datastore.HadoopLocationBased

Hadoop サポートの追加を参照してください。

ランダムな順序によるデータストアのサンプルのシャッフリングをサポートするデータストア

matlab.io.Datastorematlab.io.datastore.Shuffleable

シャッフリングのサポートの追加を参照してください。

writeall によるファイルの書き込みをサポートするデータストア

matlab.io.Datastorematlab.io.datastore.FileWritable

(オプションで matlab.io.datastore.FoldersPropertyProvider から継承すると、Folders プロパティのサポートが追加されます)

データ書き込みのサポートの追加を参照してください。

まず逐次処理のためのデータストアを実装してから、並列処理、Hadoop、シャッフリング、または書き込みのサポートを追加します。

逐次処理のためのデータストアの実装

MyDatastore という名前のカスタム データストアを実装するために、MyDatastore.m というスクリプトを作成します。スクリプトは MATLAB パス上にあり、かつ、適切なクラスから継承し、必須のメソッドを定義したコードを含んでいなければなりません。MATLAB での逐次処理用のデータストアを作成するためのコードは以下でなければなりません。

  • 基底クラス matlab.io.Datastore から継承する。

  • hasdatareadresetprogress の各メソッドを定義する。

  • データ処理およびデータ解析の必要性に基づき、追加のプロパティおよびメソッドを定義する。

サンプル実装として、以下の手順に従います。

手順実装

基底クラス Datastore から継承します。

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

カスタム データストアを作成する関数 MyDatastore を実装します。

    methods % begin methods section
        
        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

hasdata メソッドを実装します。

        function tf = hasdata(myds)
            % Return true if more data is available.
            tf = hasfile(myds.FileSet);
        end

read メソッドを実装します。

このメソッドでは MyFileReader を使用します。この関数は、独自のファイル形式を読み取るために作成しなければなりません。

独自ファイル形式を読み取るための関数の作成を参照してください。

        function [data,info] = read(myds)
            % Read data and information about the extracted data.
            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

reset メソッドを実装します。

        function reset(myds)
            % Reset to the start of the data.
            reset(myds.FileSet);
            myds.CurrentFileIndex = 1;
        end

AlternateFileSystemRoots プロパティを取得および設定するためのメソッドを定義します。

set メソッド内でデータストアをリセットしなければなりません。

        % Before defining these methods, add the AlternateFileSystemRoots 
        % property in the properties section 
    
        % 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

progress メソッドを実装します。

    methods (Hidden = true)
        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

DsFileSet オブジェクトをデータストアのプロパティとして使用する場合は、copyElement メソッドを実装します。

    methods (Access = protected)
        % If you use the DsFileSet object as a property, 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

classdef セクションを終了します。

end

独自ファイル形式を読み取るための関数の作成

カスタム データストアの read メソッドの実装には、MyFileReader という名前の関数を使用します。カスタム データまたは独自データを読み取るには、この関数を作成しなければなりません。DsFileReader オブジェクトとそのメソッドを使用して、この関数を作成します。たとえば、バイナリ ファイルを読み取る関数を作成します。

function data = MyFileReader(fileInfoTbl)
% create a reader object using the 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

並列処理のサポートの追加

Parallel Computing Toolbox および MATLAB Parallel Server で並列処理のサポートを追加するには、MyDatastore.m の実装コードを以下のように更新します。

サンプル実装として、以下の手順に従います。

手順実装

classdef セクションを更新して、Partitionable クラスから継承します。

classdef MyDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.Partitionable
     .
     .
     . 
  

partition の定義を methods セクションに追加します。

 methods
     .
     .
     .
     function subds = partition(myds,n,ii)
         subds = copy(myds);
         subds.FileSet = partition(myds.FileSet,n,ii);
         reset(subds);         
     end
 end

maxpartitions の定義を methods セクションに追加します。

 methods (Access = protected)
     function n = maxpartitions(myds) 
       n = maxpartitions(myds.FileSet); 
     end     
 end 

classdef を終了します。

end  

Hadoop サポートの追加

Hadoop のサポートを追加するには、MyDatastore.m の実装コードを以下のように更新します。

サンプル実装として、以下の手順に従います。

手順実装

classdef セクションを更新して、HadoopLocationBased クラスから継承します。

classdef MyDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.HadoopLocationBased 
     .
     .
     . 
  

getLocationinitializeDatastore、および isfullfile (オプション) の定義を methods セクションに追加します。

 methods (Hidden = true)
     .
     .
     .   

     function initializeDatastore(myds,hadoopInfo)
        import matlab.io.datastore.DsFileSet;
        myds.FileSet = DsFileSet(hadoopInfo,...
             'FileSplitSize',myds.FileSet.FileSplitSize);
        reset(myds);         
     end 
     
     function loc = getLocation(myds)
        loc = myds.FileSet;         
     end 
     
     % isfullfile method is optional
     function tf = isfullfile(myds)
        tf = isequal(myds.FileSet.FileSplitSize,'file');          
     end 
 
 end

classdef セクションを終了します。

end

シャッフリングのサポートの追加

シャッフリングのサポートを追加するには、MyDatastore.m の実装コードを以下のように更新します。

サンプル実装として、以下の手順に従います。

手順実装

classdef セクションを更新して、Shuffleable クラスから継承します。

classdef MyDatastore < matlab.io.Datastore & ...
                      matlab.io.datastore.Shuffleable 
     .
     .
     . 
  

shuffle の定義を既存の methods セクションに追加します。

  methods

        % previously defined methods
        .
        .
        . 
   
        function dsNew = shuffle(ds)
            % dsNew = shuffle(ds) shuffles the files and the
            % corresponding labels in the datastore.
            
            % Create a copy of datastore
            dsNew = copy(ds);
            dsNew.Datastore = copy(ds.Datastore);
            fds = dsNew.Datastore;
            
            % Shuffle files and corresponding labels
            numObservations = dsNew.NumObservations;
            idx = randperm(numObservations);
            fds.Files = fds.Files(idx);
            dsNew.Labels = dsNew.Labels(idx);
        end

  end

classdef セクションを終了します。

end

データ書き込みのサポートの追加

データ書き込みのサポートを追加するには、MyDatastore.m の実装コードを以下の要件に従うように更新します。

  • 追加のクラス matlab.io.datastore.FileWritable から継承する。

  • SupportedOutputFormats プロパティおよび DefaultOutputFormat プロパティを初期化する。

  • データストアがデータをカスタム形式に書き込む場合は write メソッドを実装する。

  • データストアに Files プロパティがない場合は getFiles メソッドを実装する。

  • データストアに Folders プロパティがない場合は getFolders メソッドを実装する。

  • 出力する場所が string として検証される。データストアの検証がさらに必要な場合は validateOutputLocation メソッドを実装しなければなりません。

  • データストアが、ファイルごとに複数の読み取りを必要とするファイル用の場合は、getCurrentFilename メソッドおよび currentFileIndexComparator メソッドを実装しなければならない。

  • オプションで、別の matlab.io.datastore.FoldersPropertyProvider クラスから継承して、Folders プロパティ (および writeallFolderLayout の名前と値のペア) のサポートを追加する。これを行う場合、データストア コンストラクターで populateFoldersFromLocation メソッドを使用して、Folders プロパティを入力できる。

  • writeall'UseParallel' オプションのサポートを追加するには、matlab.io.datastore.FileWritablematlab.io.datastore.Partitionable の両方からサブクラス化し、サブクラスに構文 partition(ds,'Files',index) をサポートする partition メソッドを実装しなければならない。

matlab.io.datastore.FileWritable から継承するサンプルの実装については、次の手順に従います。

手順実装

classdef セクションを更新して、FileWritable クラスから継承します。

classdef MyDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.FileWritable 
     .
     .
     . 
  

SupportedOutputFormats プロパティおよび DefaultOutputFormat プロパティを初期化します。この例のデータストアは ImageDatastore の出力形式をすべてサポートします。またカスタム形式 "dcm" もサポートします。この形式も既定の出力形式として宣言します。

    properties (Constant)
        SupportedOutputFormats = ...
       [matlab.io.datastore.ImageDatastore.SupportedOutputFormats, "dcm"];
        DefaultOutputFormat = "dcm";
    end

getFiles および getFolders の定義を既存の methods セクションに追加します。データストアに Files プロパティまたは Folders プロパティがない場合、これらのメソッドが必要です。

    methods (Access = {?matlab.io.datastore.FileWritable, ...
                    ?matlab.bigdata.internal.executor.FullfileDatastorePartitionStrategy})
        function files = getFiles(ds)
            files = {'data/folder/file1', 'data/folder/file2',...};
        end
    end
    methods (Access = protected)
        function folders = getFolders(ds)
            folders = {'data/folder1/', 'data/folder2/',...};
        end
    end

データストアがデータをカスタム形式に書き込む場合は、write メソッドを追加します。この例のメソッドは、"dcm" 用のカスタム書き込み関数と、既知の形式用に組み込まれている書き込み関数の間で、いずれを使用するかを切り替えます。

    methods(Access = protected)        
        function tf = write(myds, data, writeInfo, outFmt, varargin)
            if outFmt == "dcm" % use custom write fcn for dcm format
                dicomwrite(data, writeInfo.SuggestedOutputName, varargin{:});
            else % callback into built-in for known formats
                write@matlab.io.datastore.FileWritable(myds, data, ...
                    writeInfo, outFmt, varargin{:});
            end
            tf = true;
        end
    end

classdef セクションを終了します。

end

matlab.io.datastore.FileWritablematlab.io.datastore.FoldersPropertyProvider の両方から継承する長いクラスの例については、DICOM データ用のカスタム データストアの開発を参照してください。

カスタム データストアの検証

これまで説明してきた指示に従うと、カスタム データストアの実装手順が完了します。このカスタム データストアを使用する前に、カスタム データストアのテストのガイドラインに示されているガイドラインを使用して検定してください。

参考

| | | | | | |

関連するトピック