Эта тема показывает, как реализовать пользовательский 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 с поддержкой того, чтобы записать файлы через |
(Опционально, наследовавшись Смотрите добавляет поддержка Записи данных |
Запустите путем реализации datastore для последовательной обработки, и затем добавьте поддержку параллельной обработки, Hadoop, перестановки или записи.
Реализовывать пользовательский 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 |
Чтобы добавить поддержку того, чтобы записать данные, обновите свой код реализации в MyDatastore.m
следовать за этими требованиями:
Наследуйте от дополнительного класса matlab.io.datastore.FileWritable
.
Инициализируйте свойства SupportedOutputFormats
и DefaultOutputFormat
.
Реализуйте write
метод, если datastore записывает данные к пользовательскому формату.
Реализуйте getFiles
метод, если datastore не имеет Files
свойство.
Реализуйте getFolders
метод, если datastore не имеет Folders
свойство.
Выходное местоположение подтверждено как строка. Если ваш datastore требует дальнейшей валидации, необходимо реализовать validateOutputLocation
метод.
Если datastore предназначается для файлов, которые требуют нескольких чтений на файл, то необходимо реализовать методы getCurrentFilename
и currentFileIndexComparator
.
Для записи файла Parquet пользовательский datastore должен иметь свойство под названием ReadSize
со значением file
. Если datastore не имеет этого свойства, то это должно реализовать метод isSingleReadPerFile
.
Опционально, наследуйте от другого класса 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 квалифицируйте его с помощью инструкций, представленных в Руководстве по тестированию для Пользовательских Хранилищ данных.
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