В этом разделе показано, как реализовать пользовательский 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 |
|
Datastore с поддержкой перетасовки выборок в datastore в случайном порядке |
|
Datastore с поддержкой записи файлов через |
(Опционально наследование от Смотрите Add Support для записи данных |
Начните с реализации datastore для последовательной обработки, а затем добавьте поддержку параллельной обработки, Hadoop, тасования или записи.
Для реализации пользовательского 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 |
Чтобы добавить поддержку записи данных, обновите код реализации в MyDatastore.m
следовать этим требованиям:
Наследование от дополнительного matlab.io.datastore.FileWritable
класса.
Инициализируйте свойства SupportedOutputFormats
и DefaultOutputFormat
.
Реализуйте write
метод, если datastore записывает данные в пользовательский формат.
Реализуйте getFiles
метод, если datastore не имеет Files
свойство.
Реализуйте getFolders
метод, если datastore не имеет Folders
свойство.
Расположение выхода проверяется как строка. Если ваш datastore требует дальнейшей валидации, вы должны реализовать validateOutputLocation
способ.
Если datastore предназначен для файлов, которые требуют нескольких чтений в файле, то вы должны реализовать методы getCurrentFilename
и currentFileIndexComparator
.
Вы можете наследовать от другого класса matlab.io.datastore.FoldersPropertyProvider
чтобы добавить поддержку Folders
свойство (и, таким образом, FolderLayout
пара "имя-значение" writeall
). Если вы делаете это, то можете использовать populateFoldersFromLocation
метод в конструкторе datastore, чтобы заполнить Folders
свойство.
Как добавить поддержку 'UseParallel'
опция writeall
необходимо подкласс из обоих matlab.io.datastore.FileWritable
и matlab.io.datastore.Partitionable
и реализуйте partition
метод в подклассе, который поддерживает синтаксис partition(ds,'Files',index)
.
Для примера реализации, который наследует от matlab.io.datastore.FileWritable
, следуйте этим шагам.
Шаги | Реализация |
---|---|
Обновление |
classdef MyDatastore < matlab.io.Datastore & ... matlab.io.datastore.FileWritable . . . |
Инициализируйте свойства |
properties (Constant) SupportedOutputFormats = ... [matlab.io.datastore.ImageDatastore.SupportedOutputFormats, "dcm"]; DefaultOutputFormat = "dcm"; end |
Добавьте определения для |
methods (Access = protected) function files = getFiles(ds) files = {'data/folder/file1', 'data/folder/file2',...}; end function folders = getFolders(ds) folders = {'data/folder1/', 'data/folder2/',...}; end end |
Добавление |
methods(Access = protected) function tf = write(myds, data, writeInfo, outFmt, varargin) if outFmt == "dcm" % use custom write fcn for dcm format dicomwrite(data, writeInfo.SuggestedOutputName, varargin{:}); else % callback into built-in for known formats write@matlab.io.datastore.FileWritable(myds, data, ... writeInfo, outFmt, varargin{:}); end tf = true; end end |
Завершите |
end |
Для более длинного примера класса, который наследует от обоих matlab.io.datastore.FileWritable
и matlab.io.datastore.FoldersPropertyProvider
, см. «Разработка пользовательского Datastore для данных DICOM».
После выполнения инструкций, представленных здесь, шаг реализации вашего пользовательского datastore завершен. Прежде чем использовать этот пользовательский datastore, проверьте его с помощью руководств, представленных в Руководствах по тестированию для пользовательских Datastores.
matlab.io.Datastore
| matlab.io.datastore.DsFileReader
| matlab.io.datastore.DsFileSet
| matlab.io.datastore.FileWritable
| matlab.io.datastore.FoldersPropertyProvider
| matlab.io.datastore.HadoopLocationBased
| matlab.io.datastore.Partitionable
| matlab.io.datastore.Shuffleable