matlab.io.Datastore class

Пакет: matlab.io

Основной класс datastore

Описание

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

classdef MyDatastore < matlab.io.Datastore
    ...
end

Реализовывать ваш пользовательский datastore:

  • Наследуйте от класса matlab.io.Datastore

  • Задайте эти четыре требуемых метода: hasdataчтениесброс, и progress

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

Методы

read

Считайте данные из datastore.

[data,info] = read(ds)

data выведите может быть любой тип данных и должен быть вертикально concatenateable. Лучшая практика состоит в том, чтобы возвратить info выведите как структура.

Тип данных выхода data диктует тип данных выхода tall функция.

Access: Public, Abstract: true

hasdata

Определите, доступны ли данные для чтения. Выход имеет логический тип.

tf = hasdata(ds)

Access: Public, Abstract: true

reset

Сбросьте datastore к начальному состоянию, прежде чем любые данные будут считаны.

reset(ds)

Access: Public, Abstract: true

progress

Определите, сколько данных уже считано.

Выход является скаляром дважды между 0 и 1. Возвращаемое значение 0.55 средние значения, что вы считали 55% из данных.

p = progress(ds)

Access: Public, Abstract: true, Hidden:true

preview

Возвратите подмножество данных.

data = preview(ds)

Реализация по умолчанию возвращает первые восемь строк данных. Выход имеет совпадающий тип данных как выход read.

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

Access: Public

readall

Считывайте все данные в datastore.

data = readall(ds)

Выход имеет совпадающий тип данных как выход read. Если данные не умещаются в памяти, readall возвращает ошибку.

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

Access: Public

combine

Объедините данные от нескольких datastores.

dsnew = combine(ds1,ds2,...,dsN)

Выход dsnew новый datastore с объединенными данными, возвращенными как CombinedDatastore объект.

Access: Public

transform

Преобразуйте datastore.

dsnew = transform(ds,@fcn)

Выход dsnew новый datastore с преобразованными данными, возвращенными как TransformedDatastore объект.

Access: Public

isPartitionable

Определите, partitionable ли datastore. Выход имеет логический тип.

tf = isPartitionable(ds)

Access: Public

isShuffleable

Определите, shuffleable ли datastore. Выход имеет логический тип.

tf = isShuffleable(ds)

Access: Public

Свойства

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

Атрибуты

Sealedfalse

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

Примеры

свернуть все

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

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

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

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

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

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

%% STEP 1: INHERIT FROM DATASTORE CLASSES
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
    
    
%% STEP 2: DEFINE THE CONSTRUCTOR AND THE REQUIRED METHODS
    methods
        % Define your datastore constructor
        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
        
        % 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)
                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
        
        % Define the reset method
        function reset(myds)
            % Reset to the start of the data
            reset(myds.FileSet);
            myds.CurrentFileIndex = 1;
        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 the 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
                
    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 теперь готов. Используйте MyDatastore чтобы создать 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 использование MyDatastore функция. Для получения дополнительной информации реализации MyDatastore, смотрите Datastore Сборки в качестве примера, чтобы Считать Двоичные файлы.

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

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

preview(ds)
ans = 8x1 uint8 column vector

   113
   180
   251
    91
    29
    66
   254
   214

Считайте данные в while цикл и использование hasdata метод, чтобы проверять, доступно ли больше данных в чтение.

while hasdata(ds)
    data = read(ds);
    % do something
end

Сбросьте datastore к его начальному состоянию и считайте данные из запуска datastore.

reset(ds);
data = read(ds);

В качестве альтернативы, если ваш сбор данных умещается в памяти, то считанный все данные в datastore. Поскольку папка содержит 15 файлы с 10000 записи в каждом файле, размером выхода должен быть 150000 записи.

dataAll = readall(ds);
whos dataAll
  Name              Size             Bytes  Class    Attributes

  dataAll      150000x1             150000  uint8              

Создайте пользовательский объект datastore, сохраните его на машине Windows®, и затем загрузите и обработайте его на машине Linux®.

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

  • "Z:\DataSet" на вашей локальной машине Windows

  • "/nfs-bldg001/DataSet" в вашем кластере Linux

Затем сопоставьте эти корневые пути с помощью AlternateFileSystemRoots свойство. Для получения дополнительной информации реализации MyDatastore, смотрите пример Build Datastore to Read Binary Files.

altRoots = ["Z:\DataSet","/nfs-bldg001/DataSet"];
ds = MyDatastore('Z:\DataSet\*.bin',altRoots);

Исследуйте файлы в datastore.

fileTbl = resolve(ds.Fileset);
fileTbl.FileName
ans =

  12×1 cell array

    {'Z:\DataSet\binary_data01.bin'}
    {'Z:\DataSet\binary_data02.bin'}
    {'Z:\DataSet\binary_data03.bin'}
      .
      . 
      .

Сохраните datastore.

save ds_saved_on_Windows.mat ds

Загрузите datastore на платформе Linux и исследуйте файлы в datastore. Начиная с корневого пути 'Z:\DataSet' не доступно в кластере Linux во время загрузки, функция datastore автоматически обновляет корневые пути на основе значений, заданных в AlternateFileSystemRoots свойство.

load ds_saved_on_Windows.mat
fileTbl = resolve(ds.Fileset);
fileTbl.FileName
ans =

  12×1 cell array

    {'/nfs-bldg001/DataSet/binary_data01.bin'}
    {'/nfs-bldg001/DataSet/binary_data02.bin'}
    {'/nfs-bldg001/DataSet/binary_data03.bin'}
      .
      . 
      .
Можно теперь обработать и анализировать этот datastore на машине Linux.

Введенный в R2017b