exponenta event banner

Разработка пользовательского хранилища данных

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

Обзор

Для создания пользовательского интерфейса хранилища данных используйте пользовательские классы и объекты хранилища данных. Затем используйте пользовательское хранилище данных для переноса данных в MATLAB и использования возможностей больших данных MATLAB, таких как tall, mapreduceи Hadoop ®.

Создание пользовательского хранилища данных предполагает наследование от одного или нескольких абстрактных классов и внедрение требуемых методов. Необходимые классы и методы зависят от потребностей в обработке.

Потребности в обработке

Классы

Хранилище данных для последовательной обработки в MATLAB

matlab.io.Datastore

См. раздел Внедрение хранилища данных для последовательной обработки

Хранилище данных с поддержкой Parallel Computing Toolbox™ и MATLAB Parallel Server™

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

См. раздел Добавление поддержки параллельной обработки

Хранилище данных с поддержкой Hadoop

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

См. раздел Добавление поддержки Hadoop

Хранилище данных с поддержкой тасования выборок в хранилище данных в случайном порядке

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

См. раздел Добавление поддержки для перетасовки

Хранилище данных с поддержкой записи файлов через writeall

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

(Необязательно, наследование от matlab.io.datastore.FoldersPropertyProvider добавляет поддержку для Folders собственность.)

См. раздел Добавление поддержки для записи данных

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

Внедрение хранилища данных для последовательной обработки

Для реализации пользовательского хранилища данных с именем MyDatastore, создать сценарий MyDatastore.m. Сценарий должен находиться в пути MATLAB и содержать код, наследующий от соответствующего класса и определяющий требуемые методы. Код для создания хранилища данных для последовательной обработки в 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

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

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

    % 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

Реализация copyElement при использовании DsFileSet объект как свойство в хранилище данных.

    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 
     .
     .
     . 
  

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

  • Реализация getFiles метод, если хранилище данных не имеет Files собственность.

  • Реализация getFolders метод, если хранилище данных не имеет Folders собственность.

  • Расположение вывода проверяется как строка. Если хранилище данных требует дальнейшей проверки, необходимо внедрить validateOutputLocation способ.

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

  • При необходимости наследовать от другого класса matlab.io.datastore.FoldersPropertyProvider добавление поддержки для Folders (и, таким образом, FolderLayout пара имя-значение writeall). Если вы делаете это, то вы можете использовать populateFoldersFromLocation метод в конструкторе хранилища данных для заполнения 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. В этом примере хранилище данных поддерживает все выходные форматы ImageDatastore, а также пользовательский формат "dcm", который также объявлен как формат вывода по умолчанию.

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

Добавить определения для getFiles и getFolders к существующему methods раздел. Эти методы необходимы, если в хранилище данных нет 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 метод, когда хранилище данных намеревается записать данные в пользовательский формат. В этом примере метод переключается между использованием пользовательской функции записи для "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, см. раздел Разработка пользовательского хранилища данных для данных DICOM.

Проверка настраиваемого хранилища данных

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

См. также

| | | | | | |

Связанные темы