Разработка пользовательского Datastore

Этот пример показывает, как реализовать пользовательский datastore для основанных на файле данных. Используйте эту среду только при записи собственного интерфейса datastore. В противном случае, для стандартных форматов файлов, таких как изображения или электронные таблицы, используют существующий datastore от MATLAB®. Для получения дополнительной информации смотрите Начало работы с Datastore.

Обзор

Чтобы создать ваш пользовательский интерфейс datastore, используйте пользовательские классы datastore и объекты. Затем используйте пользовательский datastore, чтобы принести ваши данные в MATLAB и усилить MATLAB большие возможности данных, такие как tall, MapReduce и Hadoop®.

Разработка вашего пользовательского datastore включает наследование от одного или нескольких абстрактных классов и реализацию требуемых методов. Определенные классы и методы вы должны зависеть от своих потребностей обработки.

Обработка потребностей

Классы

Datastore для последовательной обработки в MATLAB

matlab.io.Datastore

Смотрите, реализуйте Datastore для последовательной обработки

Datastore с поддержкой Parallel Computing Toolbox™ и MATLAB Parallel Server™

matlab.io.Datastore и matlab.io.datastore.Partitionable

Смотрите, добавьте поддержку параллельной обработки

Datastore с поддержкой Hadoop

matlab.io.Datastore и matlab.io.datastore.HadoopLocationBased

Смотрите, добавьте поддержку Hadoop

Datastore с поддержкой перестановки выборок в datastore в произвольном порядке

matlab.io.Datastore и matlab.io.datastore.Shuffleable

Смотрите, добавьте поддержку перестановки

Запустите путем реализации datastore для последовательной обработки, и затем добавьте поддержку параллельной обработки, Hadoop и suffling.

Реализация Datastore для последовательной обработки

Чтобы реализовать пользовательский datastore под названием MyDatastore, создайте скрипт MyDatastore.m. Скрипт должен быть на пути MATLAB и должен содержать код, который наследовался соответствующему классу и задает требуемые методы. Код для создания datastore для последовательной обработки в MATLAB должен:

  • Наследуйте от базового класса matlab.io.Datastore.

  • Задайте эти методы: hasdata, read, reset и progress.

  • Задайте дополнительные свойства и методы на основе ваших потребностей обработки данных и анализа.

Для демонстрационной реализации выполните эти шаги.

ШагиРеализация

Наследуйте от базового класса Datastore.

classdef MyDatastore < matlab.io.Datastore
    
    properties (Access = private)
        CurrentFileIndex double
        FileSet matlab.io.datastore.DsFileSet
    end

Добавьте это свойство создать datastore на одной машине, которая работает беспрепятственно над другой машиной или кластером, который возможно имеет различную файловую систему или операционную систему.

Добавьте методы, чтобы получить и установить это свойство в разделе методов.

    % 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, который создает пользовательский datastore.

    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.

Необходимо сбросить datastore в методе 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 

Реализуйте метод copyElement, когда вы будете использовать объект DsFileSet в качестве свойства в вашем datastore.

    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 вашего пользовательского datastore использует функцию под названием 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 
     .
     .
     . 
  

Добавьте определение для getLocation, initializeDatastore и 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

Проверка пользовательского Datastore

После следования инструкциям представил здесь, шаг реализации вашего пользовательского datastore завершен. Перед использованием этого пользовательского datastore квалифицируйте его с помощью инструкций, представленных в Руководстве по тестированию для Пользовательских Хранилищ данных.

Смотрите также

| | | | |

Похожие темы