ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

概要

独自のカスタム データ ストア インターフェイスを作成するには、カスタム データ ストア クラスおよびオブジェクトを使用します。次に、このカスタム データ ストアを使用して MATLAB でデータを読み込み、tall、MapReduce、および 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

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

最初に逐次処理のためのデータ ストアを実装し、次に並列処理、Hadoop およびシャッフリングのサポートを追加します。

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

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

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

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

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

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

手順実装

基底クラス データ ストアから継承します。

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

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

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

参考

| | | | |

関連するトピック