В этом разделе показано, как реализовать пользовательское хранилище данных для файловых данных. Эта инфраструктура используется только при записи собственного пользовательского интерфейса хранилища данных. В противном случае для стандартных форматов файлов, таких как изображения или электронные таблицы, используйте существующее хранилище данных из MATLAB ®. Дополнительные сведения см. в разделе Начало работы с хранилищем данных.
Для создания пользовательского интерфейса хранилища данных используйте пользовательские классы и объекты хранилища данных. Затем используйте пользовательское хранилище данных для переноса данных в MATLAB и использования возможностей больших данных MATLAB, таких как tall, mapreduceи Hadoop ®.
Создание пользовательского хранилища данных предполагает наследование от одного или нескольких абстрактных классов и внедрение требуемых методов. Необходимые классы и методы зависят от потребностей в обработке.
|
Потребности в обработке |
Классы |
|---|---|
|
Хранилище данных для последовательной обработки в MATLAB |
См. раздел Внедрение хранилища данных для последовательной обработки |
|
Хранилище данных с поддержкой Parallel Computing Toolbox™ и MATLAB Parallel Server™ |
См. раздел Добавление поддержки параллельной обработки |
Хранилище данных с поддержкой Hadoop |
См. раздел Добавление поддержки Hadoop |
Хранилище данных с поддержкой тасования выборок в хранилище данных в случайном порядке |
См. раздел Добавление поддержки для перетасовки |
Хранилище данных с поддержкой записи файлов через |
(Необязательно, наследование от См. раздел Добавление поддержки для записи данных |
Начните с внедрения хранилища данных для последовательной обработки, а затем добавьте поддержку параллельной обработки, Hadoop, тасования или записи.
Для реализации пользовательского хранилища данных с именем MyDatastore, создать сценарий MyDatastore.m. Сценарий должен находиться в пути MATLAB и содержать код, наследующий от соответствующего класса и определяющий требуемые методы. Код для создания хранилища данных для последовательной обработки в MATLAB должен:
Наследование от базового класса matlab.io.Datastore.
Определите следующие методы: hasdata, read, reset, и progress.
Определите дополнительные свойства и методы на основе потребностей в обработке и анализе данных.
Для примера реализации выполните следующие действия.
| Шаги | Внедрение |
|---|---|
Наследование от базового класса |
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 |
Реализация функции |
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 |
Определите методы для получения и установки Необходимо сбросить хранилище данных в |
% 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 метод пользовательского хранилища данных использует функцию с именем 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 метод, если хранилище данных записывает данные в пользовательский формат.
Реализация getFiles метод, если хранилище данных не имеет Files собственность.
Реализация getFolders метод, если хранилище данных не имеет Folders собственность.
Расположение вывода проверяется как строка. Если хранилище данных требует дальнейшей проверки, необходимо внедрить validateOutputLocation способ.
Если хранилище данных предназначено для файлов, для которых требуется несколько операций чтения на файл, необходимо внедрить методы getCurrentFilename и currentFileIndexComparator.
При необходимости наследовать от другого класса matlab.io.datastore.FoldersPropertyProvider добавление поддержки для Folders (и, таким образом, FolderLayout пара имя-значение writeall). Если вы делаете это, то вы можете использовать populateFoldersFromLocation метод в конструкторе хранилища данных для заполнения 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, см. раздел Разработка пользовательского хранилища данных для данных DICOM.
После выполнения приведенных здесь инструкций этап внедрения пользовательского хранилища данных завершен. Прежде чем использовать это пользовательское хранилище данных, оцените его, используя рекомендации, представленные в Руководстве по тестированию пользовательских хранилищ данных.
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