matlab.io.Datastore class

Пакет: matlab.io

Базовый класс datastore

Описание

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

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

Чтобы реализовать пользовательский datastore:

  • Наследование от matlab.io.Datastore класса

  • Определите четыре необходимых метода: hasdata, read, reset, и progress

Дополнительные сведения и шаги для создания пользовательского datastore см. в разделе Разработка пользовательского Datastore.

Методы

read

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

[data,info] = read(ds)

The data выход может быть любым типом данных и должен быть вертикально конкатенируемым. Лучшая практика - вернуть 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

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

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

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

Access: Public

transform

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

dsnew = transform(ds,@fcn)

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

Access: Public

isPartitionable

Определите, является ли datastore разделяемым. Этот выход является логическим типом.

tf = isPartitionable(ds)

Access: Public

isShuffleable

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

tf = isShuffleable(ds)

Access: Public

Свойства

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

Признаки

Sealedfalse

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

Примеры

свернуть все

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

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