Разрабатывайте пользовательский 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 свойство.)

Смотрите Add Support для записи данных

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

Реализуйте 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

Добавьте поддержку записи данных

Чтобы добавить поддержку записи данных, обновите код реализации в 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, проверьте его с помощью руководств, представленных в Руководствах по тестированию для пользовательских Datastores.

См. также

| | | | | | |

Похожие темы