matlab.io.datastore. Класс Partitionable

Пакет: matlab.io.datastore

Добавьте поддержку распараллеливания datastore

Описание

matlab.io.datastore.Partitionable является абстрактным классом mixin, который добавляет поддержку распараллеливания вашему пользовательскому datastore для использования с Parallel Computing Toolbox™ и MATLAB® Parallel Server™.

Чтобы использовать этот класс mixin, необходимо наследоваться классу matlab.io.datastore.Partitionable, в дополнение к наследованию от базового класса matlab.io.Datastore. Введите следующий синтаксис как первую строку вашего файла определения класса:

classdef MyDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.Partitionable
    ...
end

Чтобы добавить поддержку параллельной обработки к вашему пользовательскому datastore, вы должны:

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

Методы

maxpartitions Максимальное количество возможных разделов
numpartitionsКоличество по умолчанию разделов
partition Разделите datastore

Атрибуты

Sealedfalse

Для получения информации об атрибутах класса см. Атрибуты класса.

Примеры

свернуть все

Создайте datastore с поддержкой параллельной обработки и используйте ее, чтобы принести ваши пользовательские или собственные данные в MATLAB®. Затем обработайте данные в параллельном пуле.

Создайте файл определения класса .m, который содержит код, реализующий ваш пользовательский datastore. Необходимо сохранить этот файл в рабочей папке или в папке, которая находится на пути MATLAB®. Имя файла .m должно совпасть с именем вашей функции конструктора Object. Например, если вы хотите, чтобы ваша функция конструктора имела имя MyDatastorePar, затем именем файла .m должен быть MyDatastorePar.m. Файл определения класса .m должен содержать следующие шаги:

  • Шаг 1: Наследуйтесь классам datastore.

  • Шаг 2: Задайте конструктора и требуемые методы.

  • Шаг 3: Задайте свою пользовательскую функцию чтения файла.

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

%% STEP 1: INHERIT FROM DATASTORE CLASSES
classdef MyDatastorePar < matlab.io.Datastore & ...
        matlab.io.datastore.Partitionable
   
    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
    
%% STEP 2: DEFINE THE CONSTRUCTOR AND THE REQUIRED METHODS
    methods
        % Define your datastore constructor
        function myds = MyDatastorePar(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
        
        % Define the hasdata method
        function tf = hasdata(myds)
            % Return true if more data is available
            tf = hasfile(myds.FileSet);
        end
        
        % Define the read method
        function [data,info] = read(myds)
            % Read data and information about the extracted data
            % See also: MyFileReader()
            if ~hasdata(myds)
                msgII = ['Use the reset method to reset the datastore ',... 
                         'to the start of the data.']; 
                msgIII = ['Before calling the read method, ',...
                          'check if data is available to read ',...
                          'by using the hasdata method.'];
                error('No more data to read.\n%s\n%s',msgII,msgIII);
            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
        
        % Define the reset method
        function reset(myds)
            % Reset to the start of the data
            reset(myds.FileSet);
            myds.CurrentFileIndex = 1;
        end

        % Define the partition method
        function subds = partition(myds,n,ii)
            subds = copy(myds);
            subds.FileSet = partition(myds.FileSet,n,ii);
            reset(subds);
        end
        
        % 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 AlternateFileSystemRoots
              % for your datastore
              myds.FileSet.AlternateFileSystemRoots = altRoots;

              % Reset the datastore
              reset(myds);  
            catch ME
              throw(ME);
            end
        end
      
    end
    
    methods (Hidden = true)          
        % Define the progress method
        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
    
    methods(Access = protected)
        % If you use the  FileSet property in the datastore,
        % 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
        
        % Define the maxpartitions method
        function n = maxpartitions(myds)
            n = maxpartitions(myds.FileSet);
        end
    end
end

%% STEP 3: IMPLEMENT YOUR CUSTOM FILE READING FUNCTION
function data = MyFileReader(fileInfoTbl)
% create a reader object using 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

Ваш пользовательский datastore теперь готов. Используйте свой пользовательский datastore, чтобы считать и обработать данные в параллельном пуле.

Используйте пользовательский datastore, чтобы предварительно просмотреть и считать ваши собственные данные в MATLAB для параллельной обработки.

Этот пример использует простой набор данных, чтобы проиллюстрировать рабочий процесс с помощью пользовательского datastore. Набор данных является набором 15 двоичных файлов (.bin) файлы, где каждый файл содержит столбец (переменная 1) и строки 10000 (записи) беззнакового целого.

dir('*.bin')
binary_data01.bin  binary_data05.bin  binary_data09.bin  binary_data13.bin  
binary_data02.bin  binary_data06.bin  binary_data10.bin  binary_data14.bin  
binary_data03.bin  binary_data07.bin  binary_data11.bin  binary_data15.bin  
binary_data04.bin  binary_data08.bin  binary_data12.bin  

Создайте объект datastore использование функции MyDatastorePar. Для получения дополнительной информации реализации MyDatastorePar смотрите Datastore Сборки в качестве примера с Поддержкой Параллельной обработки.

folder = fullfile('*.bin'); 
ds = MyDatastorePar(folder); 

Предварительно просмотрите данные от datastore.

preview(ds)
ans = 8x1 uint8 column vector

   113
   180
   251
    91
    29
    66
   254
   214

Идентифицируйте количество разделов для вашего datastore. Если у вас есть Parallel Computing Toolbox (PCT), то можно использовать n = numpartitions(ds,myPool), где myPool является gcp или parpool.

n = numpartitions(ds); 

Разделите datastore в части n и рабочих n в параллельном пуле.

parfor ii = 1:n
    subds = partition(ds,n,ii);
      while hasdata(subds)
        data = read(subds);
        % do something
      end
end

Чтобы обработать ваш datastore с параллельными и распределенными вычислениями, которые включают облако другой платформы или кластерные машины, необходимо предопределить параметр 'AlternateFileSystemRoots'. Например, создайте datastore на своей локальной машине и анализируйте небольшую часть данных. Затем увеличьте свой анализ к целому набору данных с помощью Parallel Computing Toolbox и MATLAB Parallel Server.

Создайте datastore с помощью MyDatastorePar и присвойте значение свойству 'AlternateFileSystemRoots'. Для получения дополнительной информации реализации MyDatastorePar смотрите пример Build Datastore with Parallel Processing Support.

Чтобы установить значение для свойства 'AlternateFileSystemRoots', идентифицируйте корневые пути для своих данных по другим платформам. Корневые пути отличаются на основе машины или файловой системы. Например, если вы получаете доступ к своим данным с помощью этих корневых путей:

  • "Z:\DataSet" от машины Windows®.

  • "/nfs-bldg001/DataSet" от кластера MATLAB Parallel Server Linux®.

Затем сопоставьте эти корневые пути с помощью свойства AlternateFileSystemRoots.

altRoots = ["Z:\DataSet","/nfs-bldg001/DataSet"];
ds = MyDatastorePar('Z:\DataSet',altRoots);

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

tt = tall(partition(ds,100,1)); 
summary(tt); 
% analyze your data                        
tt = rmmissing(tt);               
plot(tt.MyVar1,tt.MyVar2)     

Увеличьте свой анализ к целому набору данных при помощи кластера MATLAB Parallel Server (кластер Linux). Например, запустите пул рабочего с помощью кластерного профиля, и затем выполните анализ целого набора данных при помощи возможностей параллельных и распределенных вычислений.

parpool('MyMjsProfile') 
tt = tall(ds);          
summary(tt);
% analyze your data
tt = rmmissing(tt);               
plot(tt.MyVar1,tt.MyVar2)

Советы

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

Введенный в R2017b