раздел

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

Синтаксис

subds = partition(ds,n,index)

Описание

пример

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

Входные параметры

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

Введите datastore, заданный как объект matlab.io.Datastore. Чтобы создать объект Datastore, смотрите matlab.io.Datastore.

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

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

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

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

Пример 3

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

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

Пример 1

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

Примеры

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

Создайте 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, чтобы считать и обработать данные в параллельном пуле.

Больше о

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

Советы

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

    • Прежде, чем создать разделенный datastore subds, создайте глубокую копию исходного datastore ds.

    • В конце метода partition, сброс разделенный datastore subds.

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

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

Смотрите также

| | |

Введенный в R2017b