exponenta event banner

разделение

Класс: matlab.io.datastore.Partitionable
Пакет: matlab.io.datastore

Разделение хранилища данных

Описание

пример

subds = partition(ds,n,index) хранилище данных разделов ds в число деталей, указанных n и возвращает раздел, соответствующий индексу index. Секционированное хранилище данных subds имеет тот же тип, что и хранилище входных данных ds.

Входные аргументы

развернуть все

Хранилище входных данных, указанное как matlab.io.Datastore объект. Создание Datastore объект, см. matlab.io.Datastore.

Число разделов, указанное как положительное целое число. Чтобы получить разумное значение для n, используйте numpartitions функция.

При указании значения n , который не входит в диапазон разделов, доступных для хранилища данных, partition возвращает пустое хранилище данных. Дополнительные сведения см. в разделе Пустые хранилища данных. Например, если хранилище данных может содержать до 10 разделы, затем выходные данные partition метод зависит от значения n.

  • Если указанное значение n меньше или равно 10, то partition возвращает раздел, указанный index. Например, partition(ds,10,1) возвращает копию первого раздела исходного хранилища данных ds.

  • Если указанное значение n больше, чем 10, то partition возвращает пустое хранилище данных. Например, partition(ds,100,11) возвращает пустое хранилище данных.

Пример: 3

Типы данных: double

Индекс, заданный как положительное целое число.

Пример: 1

Типы данных: double

Признаки

Abstracttrue

Сведения об атрибутах методов см. в разделе Атрибуты метода.

Примеры

развернуть все

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

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

  • Шаг 1. Наследование из классов хранилища данных.

  • Шаг 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

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

Подробнее

развернуть все

Совет

  • В вашей реализации partition , необходимо включить эти шаги.

    • Перед созданием секционированного хранилища данных subds, создание глубокой копии исходного хранилища данных ds.

    • В конце partition метод, сброс секционированного хранилища данных subds.

    Для выборочной реализации partition см. раздел Добавление поддержки параллельной обработки.

  • Если раздел хранилища данных не содержит читаемой записи, read метод должен возвращать пустые данные. Неталловые измерения этих пустых данных должны соответствовать неталловым измерениям read вывод способа на раздел с читаемыми записями. Это требование гарантирует, что поведение readall метод соответствует поведению gather функция.

Представлен в R2017b