Разработка пользовательского 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 с поддержкой того, чтобы записать файлы через writeall

matlab.io.Datastore и matlab.io.datastore.FileWritable

(Опционально, наследовавшись matlab.io.datastore.FoldersPropertyProvider добавляет поддержка Folders свойство.

Смотрите добавляет поддержка Записи данных

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

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

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

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

  • Задайте эти методы: hasdataчтениесброс, и 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 
     .
     .
     . 
  

Добавьте определение для 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 метод, если datastore записывает данные к пользовательскому формату.

  • Реализуйте getFiles метод, если datastore не имеет Files свойство.

  • Реализуйте getFolders метод, если datastore не имеет Folders свойство.

  • Выходное местоположение подтверждено как строка. Если ваш datastore требует дальнейшей валидации, необходимо реализовать validateOutputLocation метод.

  • Если datastore предназначается для файлов, которые требуют нескольких чтений на файл, то необходимо реализовать методы getCurrentFilename и currentFileIndexComparator.

  • Опционально, наследуйте от другого класса matlab.io.datastore.FoldersPropertyProvider добавить поддержку Folders свойство (и таким образом FolderLayout пара "имя-значение" writeall). Если вы делаете это, то можно использовать populateFoldersFromLocation метод в конструкторе datastore, чтобы заполнить Folders свойство.

  • Добавить поддержку 'UseParallel' опция writeall, необходимо разделить на подклассы от обоих matlab.io.datastore.FileWritable и matlab.io.datastore.Partitionable и реализуйте partition метод в подклассе, который поддерживает синтаксис partition(ds,'Files',index).

Для демонстрационной реализации, которая наследовалась matlab.io.datastore.FileWritable, выполните эти шаги.

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

Обновите classdef разделите, чтобы наследоваться FileWritable класс.

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

Инициализируйте свойства SupportedOutputFormats и DefaultOutputFormat. В этом примере datastore поддерживает все выходные форматы ImageDatastore, а также пользовательский формат "dcm", который также объявляется как выходной формат по умолчанию.

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

Добавьте определения для getFiles и getFolders к существующему methods раздел. Эти методы требуются, когда datastore не имеет Files или Folders свойства.

    methods (Access = protected)
        function files = getFiles(ds)
            files = {'data/folder/file1', 'data/folder/file2',...};
        end
        function folders = getFolders(ds)
            folders = {'data/folder1/', 'data/folder2/',...};
        end
    end

Добавьте write метод, когда datastore намеревается записать данные к пользовательскому формату. В этом примере метод переключается между использованием пользовательской функции записи для "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.FileWritable и matlab.io.datastore.FoldersPropertyProvider, смотрите Разрабатывают Пользовательский Datastore для Данных DICOM.

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

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

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

| | | | | | |

Похожие темы