主要内容

开发自定义数据存储

本主题展示如何为基于文件的数据实现自定义数据存储。仅在编写自己的自定义数据存储接口时使用此框架。否则,对于标准文件格式(如图像或电子表格),请使用MATLAB中的现有数据存储®.有关更多信息,请参见从数据存储开始

概述

要构建自定义数据存储接口,请使用自定义数据存储类和对象。然后,使用自定义数据存储将数据带入MATLAB并利用MATLAB大数据功能,例如mapreduce,以及Hadoop®

设计自定义数据存储包括从一个或多个抽象类继承并实现所需的方法。您需要的特定类和方法取决于您的处理需求。

处理需求

MATLAB中串行处理的数据存储

matlab.io.Datastore

看到实现串行处理的数据存储

支持并行计算工具箱的数据存储金宝appMATLAB并行服务器

matlab.io.Datastore而且matlab.io.datastore.Partitionable

看到为并行处金宝app理添加支持

支持Hadoop的数据存储金宝app

matlab.io.Datastore而且matlab.io.datastore.HadoopLocationBased

看到添加Ha金宝appdoop支持

支持以随机顺序在数据存储中变换金宝app样本的数据存储

matlab.io.Datastore而且matlab.io.datastore.Shuffleable

看到增加对变金宝app换的支持

支持通过写入文件的数据存储金宝appwriteall

matlab.io.Datastore而且matlab.io.datastore.FileWritable

(可选地,从matlab.io.datastore.FoldersPropertyProvider添加对金宝app文件夹财产。)

看到增加数据金宝app写入支持

首先实现用于串行处理的数据存储,然后添加对并行处理、Hadoop、变换或写入的支持。金宝app

实现串行处理的数据存储

来实现一个名为MyDatastore,创建一个脚本MyDatastore.m.脚本必须在MATLAB路径上,并且应该包含从适当的类继承并定义所需方法的代码。在MATLAB中为串行处理创建数据存储的代码必须:

  • 从基类继承matlab.io.Datastore

  • 定义这些方法:hasdata重置,进步

  • 根据数据处理和分析需求定义其他属性和方法。

对于示例实现,请执行以下步骤。

步骤 实现

从基类继承数据存储

classdefMyDatastore < matlab.io.Datastore属性(Access = private) CurrentFileIndex文件集matlab.io.datastore.DsFileSet结束

添加此属性可在一台机器上创建数据存储,该数据存储可在另一台机器或集群上无缝运行,而另一台机器或集群可能具有不同的文件系统或操作系统。

在方法部分中添加方法以获取和设置此属性。

属性支持的保存、加载和处理金宝app%数据存储在不同的文件系统机器或集群上。此外,定义get.AlternateFileSystemRoots()方法%和方法部分中的set.AlternateFileSystemRoots()。(依赖)AlternateFileSystemRoots属性结束

实现函数MyDatastore这将创建自定义数据存储。

方法% begin方法节函数myds = MyDatastore(location,altRoots)文件集= matlab.io.datastore.DsFileSet(location,...“FileExtensions”“。斌”...“FileSplitSize”8 * 1024);myds。CurrentFileIndex = 1;如果Nargin == 2 myds。AlternateFileSystemRoots = altRoots;结束重置(myds);结束

实现hasdata方法。

函数Tf = hasdata(myds)%如果有更多可用数据则返回true。tf = hasfile(myds.FileSet);结束

实现方法。

该方法使用MyFileReader,这是读取专有文件格式时必须创建的函数。

看到创建函数读取您的私有文件格式

函数[data,info] = read(myds)读取数据和提取数据的相关信息。如果~ hasdata (myds)错误(sprintf ([“没有更多的数据需要读取。\nUse reset '...方法将数据存储重置到'...的数据。\n在调用read方法之前...'检查数据是否可用'...'使用hasdata方法。')))结束fileInfoTbl = nextfile(myds.FileSet);data = MyFileReader(fileInfoTbl);信息。Size = Size(数据);信息。FileName = fileInfoTbl.FileName;信息。Offset = fileInfoTbl.Offset;更新CurrentFileIndex以跟踪进度如果fileInfoTbl。Offset + fileInfoTbl。SplitSize > =...fileInfoTbl。文件大小myds。CurrentFileIndex = myds。CurrentFileIndex + 1;结束结束

实现重置方法。

函数重置(myds)重置到数据的开始位置。重置(myds.FileSet);myds。CurrentFileIndex = 1;结束

属性的方法AlternateFileSystemRoots财产。

中的数据存储必须重置方法。

在定义这些方法之前,添加AlternateFileSystemRoots%属性AlternateFileSystemRoots属性的Getter函数altRoots = get.AlternateFileSystemRoots(myds) altRoots = myds. fileset . alternatefilesystemroots;结束% Setter为AlternateFileSystemRoots属性函数set.AlternateFileSystemRoots (myds altRoots)试一试DsFileSet对象管理AlternateFileSystemRoots对象%为您的数据存储myds.FileSet.AlternateFileSystemRoots = altRoots;重置数据存储重置(myds);我把(我);结束结束结束

实现进步方法。

方法(Hidden = true)函数Frac = progress(myds)确定从数据存储读取数据的百分比如果hasdata(myds) frac = (myds. currentfileindex -1)/...myds.FileSet.NumFiles;其他的Frac = 1;结束结束结束

实现copyElement方法时使用DsFileSet对象作为数据存储中的属性。

方法(Access = protected)如果使用DsFileSet对象作为属性,则您必须定义copyElement方法。的copyElement方法允许readall和preview等方法%保持无状态函数dscopy = copyElement(ds) dscopy = copyElement@matlab.mixin.Copyable(ds);dscopy。FileSet = copy(ds.FileSet);结束结束

结束classdef部分。

结束

创建函数读取您的私有文件格式

实施方法使用名为MyFileReader.必须创建此函数来读取自定义或专有数据。使用以下命令构建此函数DsFileReader对象及其方法。例如,创建一个读取二进制文件的函数。

函数data = MyFileReader(fileInfoTbl)使用FileName创建一个reader对象reader = matlab.io.datastore.DsFileReader(fileInfoTbl.FileName);寻求抵消寻求(读者,fileInfoTbl。抵消,“起源”“start-of-file”);% read fileInfoTbl. %SplitSize数据量data = read(reader,fileInfoTbl.SplitSize);结束

为并行处金宝app理添加支持

使用并行计算工金宝app具箱和添加对并行处理的支持MATLAB并行服务器,更新您的实现代码MyDatastore.m:

对于示例实现,请执行以下步骤。

步骤 实现

更新classdef类继承的的分区类。

classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore.Partitionable…

为添加定义分区方法部分。

方法……函数Subds =分区(myds,n,ii) Subds =复制(myds);再分。FileSet = partition(myds.FileSet,n,ii);重置(再分);结束结束

为添加定义maxpartitions方法部分。

方法(Access = protected)函数n = maxpartitions(myds. fileset);结束结束

结束classdef

结束

添加Ha金宝appdoop支持

要添加对Had金宝appoop的支持,请在中更新实现代码MyDatastore.m:

对于示例实现,请执行以下步骤。

步骤 实现

更新classdef类继承的HadoopLocationBased类。

classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore. hadoop plocationbased…

为添加定义getLocationinitializeDatastore,isfullfile(可选)到方法部分。

方法(Hidden = true)…函数initializeDatastore (myds hadoopInfo)导入matlab.io.datastore.DsFileSet;myds。FileSet = DsFileSet(hadoopInfo,...“FileSplitSize”, myds.FileSet.FileSplitSize);重置(myds);结束函数loc = getLocation(myds);结束% isfullfile方法是可选的函数tf = isfullfile(myds) tf = isequal(myds. fileset . filesplitsize,“文件”);结束结束

结束classdef部分。

结束

增加对变金宝app换的支持

若要添加对变换金宝app的支持,请在中更新实现代码MyDatastore.m:

对于示例实现,请执行以下步骤。

步骤 实现

更新classdef类继承的Shuffleable类。

classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore.Shuffleable…

为添加定义洗牌到现有的方法部分。

方法%先前定义的方法……函数dsNew = shuffle(ds)% dsNew = shuffle(ds)打乱文件和%对应的标签在数据存储。创建一个数据存储副本dsNew =复制(ds);dsNew。Datastore = copy(ds.Datastore);fds = dsnew .数据存储;打乱文件和相应的标签numObservations = dsNew.NumObservations;idx = randperm(numObservations);fds。Files = fds.Files(idx);dsNew。标签= dsNew.Labels(idx);结束结束

结束classdef部分。

结束

增加数据金宝app写入支持

要添加对写入数金宝app据的支持,请在中更新实现代码MyDatastore.m遵循这些要求:

的示例实现matlab.io.datastore.FileWritable,请遵循以下步骤。

步骤 实现

更新classdef类继承的FileWritable类。

classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore.FileWritable…

初始化属性金宝appSupportedOutputFormats而且DefaultOutputFormat.在本例中,数据存储支持的所有输出格式金宝appImageDatastore,以及自定义格式“dcm”,它也被声明为默认输出格式。

properties(常量)Supporte金宝appdOutputFormats =...[matlab.io.datastore.ImageDatastore.金宝appSupportedOutputFormats,“dcm”];DefaultOutputFormat =“dcm”结束

添加定义getfile而且getFolders到现有的方法部分。当数据存储没有时,就需要这些方法文件文件夹属性。

方法(Access = protected)函数getFiles(ds) files = {“数据/文件夹/ file1”“数据/文件夹/ file2”...};结束函数文件夹= getFolders(ds)“数据/ folder1 /”“数据/ folder2 /”...};结束结束

添加一个当数据存储打算将数据写入自定义格式时,方法。在本例中,该方法在使用自定义写函数之间切换“dcm”以及针对已知格式的内置写函数。

方法(Access = protected)函数tf = write(myds, data, writeInfo, outFmt, varargin)如果outFmt = =“dcm”%使用自定义写FCN为DCM格式writeInfo dicomwrite(数据。SuggestedOutputName,变长度输入宗量{:});其他的%回调到内置的已知格式write@matlab.io.datastore.FileWritable (myds、数据...writeInfo, outFmt, varargin{:});结束Tf = true;结束结束

结束classdef部分。

结束

从两者继承的较长的示例类matlab.io.datastore.FileWritable而且matlab.io.datastore.FoldersPropertyProvider,请参阅为DICOM数据开发自定义数据存储

验证自定义数据存储

按照这里给出的说明执行之后,自定义数据存储的实现步骤就完成了。在使用此自定义数据存储之前,请使用中提供的指南对其进行限定自定义数据存储的测试指南

另请参阅

|||||||

相关的话题