exponenta event banner

matlab.io.Datastore класс

Пакет: matlab.io

Базовый класс хранилища данных

Описание

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

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

Чтобы внедрить пользовательское хранилище данных, выполните следующие действия.

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

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

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

Методы

read

Считывание данных из хранилища данных.

[data,info] = read(ds)

data выходные данные могут быть любого типа и должны быть вертикально сцепляемыми. Передовой практикой является возврат info вывод в виде структуры.

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

Access: Public, Abstract: true

hasdata

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

tf = hasdata(ds)

Access: Public, Abstract: true

reset

Сбросьте хранилище данных в исходное состояние перед считыванием данных.

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

Считывание всех данных в хранилище данных.

data = readall(ds)

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

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

Access: Public

combine

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

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

Продукция dsnew является новым хранилищем данных с объединенными данными, возвращенными в виде CombinedDatastore объект.

Access: Public

transform

Преобразование хранилища данных.

dsnew = transform(ds,@fcn)

Продукция dsnew является новым хранилищем данных с преобразованными данными, возвращенными в виде TransformedDatastore объект.

Access: Public

isPartitionable

Определите, является ли хранилище данных разделяемым. Выходные данные имеют тип logical.

tf = isPartitionable(ds)

Access: Public

isShuffleable

Определите, является ли хранилище данных изменяемым. Выходные данные имеют тип logical.

tf = isShuffleable(ds)

Access: Public

Свойства

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

Признаки

Sealedfalse

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

Примеры

свернуть все

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

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

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

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

Пользовательское хранилище данных готово. Использовать MyDatastore для создания объекта хранилища данных для чтения двоичных файлов данных.

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

В этом примере для иллюстрации рабочего процесса с использованием пользовательского хранилища данных используется простой набор данных. Набор данных представляет собой коллекцию из 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  

Создание объекта хранилища данных с помощью MyDatastore функция. Для получения подробной информации о реализации MyDatastore, см. пример «Создание хранилища данных для чтения двоичных файлов».

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

Предварительный просмотр данных из хранилища данных.

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

Восстановите исходное состояние хранилища данных и считайте данные из его начала.

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

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

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

  dataAll      150000x1             150000  uint8              

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

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

  • "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);

Проверьте файлы в хранилище данных.

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'}
      .
      . 
      .

Сохраните хранилище данных.

save ds_saved_on_Windows.mat ds

Загрузите хранилище данных на платформу Linux и проверьте файлы в хранилище данных. Начиная с корневого пути 'Z:\DataSet' недоступен в кластере Linux во время загрузки, функция хранилища данных автоматически обновляет корневые пути на основе значений, указанных в 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'}
      .
      . 
      .
Теперь это хранилище данных можно обрабатывать и анализировать на компьютере с Linux.

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