matlab.io. Класс datastore

Пакет: matlab.io

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

Описание

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

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

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

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

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

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

Методы

чтение

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

[data,info] = read(ds)

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

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

Доступ: Общественность, краткий обзор: tRUE

hasdata

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

tf = hasdata(ds)

Доступ: Общественность, краткий обзор: tRUE

сброс

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

reset(ds)

Доступ: Общественность, краткий обзор: tRUE

прогресс

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

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

p = progress(ds)

Доступ: Общественность, Краткий обзор: верный, Hidden:true

предварительный просмотр

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

data = preview(ds)

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

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

Доступ: Общественность

readall

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

data = readall(ds)

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

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

Доступ: Общественность

Свойства

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

Атрибуты

Sealedложь

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

Примеры

свернуть все

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

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

Была ли эта тема полезной?