В этом примере показано, как реализовать пользовательский 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чтениесброс, и 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