Этот пример показывает, как реализовать пользовательский datastore для основанных на файле данных. Используйте эту среду только при записи собственного интерфейса datastore. В противном случае, для стандартных форматов файлов, таких как изображения или электронные таблицы, используют существующий datastore от MATLAB®. Для получения дополнительной информации смотрите Начало работы с Datastore.
Чтобы создать ваш пользовательский интерфейс datastore, используйте пользовательские классы datastore и объекты. Затем используйте пользовательский datastore, чтобы принести ваши данные в MATLAB и усилить MATLAB большие возможности данных, такие как tall
, MapReduce и Hadoop®.
Разработка вашего пользовательского datastore включает наследование от одного или нескольких абстрактных классов и реализацию требуемых методов. Определенные классы и методы вы должны зависеть от своих потребностей обработки.
Обработка потребностей |
Классы |
---|---|
Datastore для последовательной обработки в MATLAB |
Смотрите, реализуйте Datastore для последовательной обработки |
Datastore с поддержкой Parallel Computing Toolbox™ и MATLAB Parallel Server™ |
|
Datastore с поддержкой Hadoop |
Смотрите, добавьте поддержку Hadoop |
Datastore с поддержкой перестановки выборок в datastore в произвольном порядке |
Смотрите, добавьте поддержку перестановки |
Запустите путем реализации datastore для последовательной обработки, и затем добавьте поддержку параллельной обработки, Hadoop и suffling.
Чтобы реализовать пользовательский datastore под названием MyDatastore
, создайте скрипт MyDatastore.m
. Скрипт должен быть на пути MATLAB и должен содержать код, который наследовался соответствующему классу и задает требуемые методы. Код для создания datastore для последовательной обработки в MATLAB должен:
Наследуйте от базового класса matlab.io.Datastore
.
Задайте эти методы: hasdata
, read
, reset
и progress
.
Задайте дополнительные свойства и методы на основе ваших потребностей обработки данных и анализа.
Для демонстрационной реализации выполните эти шаги.
Шаги | Реализация |
---|---|
Наследуйте от базового класса |
classdef MyDatastore < matlab.io.Datastore properties (Access = private) CurrentFileIndex double FileSet matlab.io.datastore.DsFileSet end |
Добавьте это свойство создать datastore на одной машине, которая работает беспрепятственно над другой машиной или кластером, который возможно имеет различную файловую систему или операционную систему. Добавьте методы, чтобы получить и установить это свойство в разделе методов. |
% 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 |
Реализуйте функциональный |
methods % begin methods section 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 |
Реализуйте метод |
function tf = hasdata(myds) % Return true if more data is available. tf = hasfile(myds.FileSet); end |
Реализуйте метод Этот метод использует См. Создание функции, чтобы считать ваш собственный формат файла. |
function [data,info] = read(myds) % Read data and information about the extracted data. 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 |
Реализуйте метод |
function reset(myds) % Reset to the start of the data. reset(myds.FileSet); myds.CurrentFileIndex = 1; end |
Задайте методы, чтобы получить и установить свойство Необходимо сбросить datastore в методе |
% Before defining these methods, add the AlternateFileSystemRoots % property in the properties section % 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) 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 DsFileSet object as a property, 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 |
Реализация метода read
вашего пользовательского datastore использует функцию под названием MyFileReader
. Необходимо создать эту функцию, чтобы считать пользовательские или собственные данные. Создайте эту функцию с помощью объекта DsFileReader
и его методов. Например, создайте функцию, которая читает двоичные файлы.
function data = MyFileReader(fileInfoTbl) % create a reader object using the 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
Чтобы добавить поддержку параллельной обработки с Parallel Computing Toolbox и MATLAB Parallel Server, обновите свой код реализации в MyDatastore.m
к:
Наследуйте от дополнительного класса matlab.io.datastore.Partitionable
.
Задайте два дополнительных метода: maxpartitions
и partition
.
Для демонстрационной реализации выполните эти шаги.
Шаги | Реализация |
---|---|
Обновите раздел |
classdef MyDatastore < matlab.io.Datastore & ... matlab.io.datastore.Partitionable . . . |
Добавьте определение для |
methods . . . function subds = partition(myds,n,ii) subds = copy(myds); subds.FileSet = partition(myds.FileSet,n,ii); reset(subds); end end |
Добавьте определение для |
methods (Access = protected) function n = maxpartitions(myds) n = maxpartitions(myds.FileSet); end end |
Закончите |
end |
Чтобы добавить поддержку Hadoop, обновите свой код реализации в MyDatastore.m
к:
Наследуйте от дополнительного класса matlab.io.datastore.HadoopLocationBased
.
Задайте два дополнительных метода: getLocation
и initializeDatastore
.
Для демонстрационной реализации выполните эти шаги.
Шаги | Реализация |
---|---|
Обновите раздел |
classdef MyDatastore < matlab.io.Datastore & ... matlab.io.datastore.HadoopLocationBased . . . |
Добавьте определение для |
methods (Hidden = true) . . . function initializeDatastore(myds,hadoopInfo) import matlab.io.datastore.DsFileSet; myds.FileSet = DsFileSet(hadoopInfo,... 'FileSplitSize',myds.FileSet.FileSplitSize); reset(myds); end function loc = getLocation(myds) loc = myds.FileSet; end % isfullfile method is optional function tf = isfullfile(myds) tf = isequal(myds.FileSet.FileSplitSize,'file'); end end |
Закончите раздел |
end |
Чтобы добавить поддержку перестановки, обновите свой код реализации в MyDatastore.m
к:
Наследуйте от дополнительного класса matlab.io.datastore.Shuffleable
.
Задайте дополнительный метод shuffle
.
Для демонстрационной реализации выполните эти шаги.
Шаги | Реализация |
---|---|
Обновите раздел |
classdef MyDatastore < matlab.io.Datastore & ... matlab.io.datastore.Shuffleable . . . |
Добавьте определение для |
methods % previously defined methods . . . function dsNew = shuffle(ds) % dsNew = shuffle(ds) shuffles the files and the % corresponding labels in the datastore. % Create a copy of datastore dsNew = copy(ds); dsNew.Datastore = copy(ds.Datastore); fds = dsNew.Datastore; % Shuffle files and corresponding labels numObservations = dsNew.NumObservations; idx = randperm(numObservations); fds.Files = fds.Files(idx); dsNew.Labels = dsNew.Labels(idx); end end |
Закончите раздел |
end |
После следования инструкциям представил здесь, шаг реализации вашего пользовательского datastore завершен. Перед использованием этого пользовательского datastore квалифицируйте его с помощью инструкций, представленных в Руководстве по тестированию для Пользовательских Хранилищ данных.
matlab.io.Datastore
| matlab.io.datastore.DsFileReader
| matlab.io.datastore.DsFileSet
| matlab.io.datastore.HadoopLocationBased
| matlab.io.datastore.Partitionable
| matlab.io.datastore.Shuffleable