matlab.io.datastore.Partitionable class

Пакет: 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 файл должен совпадать с именем функции конструктора объектов. Например, если вы хотите, чтобы ваша функция конструктора имела имя MyDatastorePar, то имя .m файл должен быть MyDatastorePar.m. The .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, см. пример Build 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