开发自定义数据存储
本主题演示如何为基于文件的数据实现自定义数据存储。仅在编写自定义数据存储接口时使用此框架。否则,对于标准文件格式,如图像或电子表格,使用MATLAB中的现有数据存储®.有关更多信息,请参见从数据存储开始.
概述
要构建自定义数据存储接口,请使用自定义数据存储类和对象。然后,使用自定义数据存储将数据导入MATLAB并利用MATLAB大数据功能,例如高
,mapreduce
, Hadoop®.
设计自定义数据存储涉及从一个或多个抽象类继承并实现所需的方法。您需要的特定类和方法取决于您的处理需求。
处理需求 |
类 |
---|---|
MATLAB中串行处理的数据存储 |
|
支持并行计算工具箱™和的数据存储MATLAB并行服务器™ |
|
支持Hadoop的数据存储 |
|
支持在数据存储中以随机顺序排列样本的数据存储 |
看到增加对洗牌的支持 |
支持通过写入文件的数据存储 |
(可选,继承 看到增加写数据支持 |
首先实现串行处理的数据存储,然后添加对并行处理、Hadoop、洗漱或写入的支持。
实现串行处理的数据存储
来实现一个名为MyDatastore
,创建一个脚本MyDatastore.m
.脚本必须在MATLAB路径上,并且应该包含从适当的类继承并定义所需方法的代码。在MATLAB中为串行处理创建数据存储的代码必须:
从基类继承
matlab.io.Datastore
.定义这些方法:
hasdata
,读
,重置
,进步
.根据数据处理和分析需求定义其他属性和方法。
对于示例实现,请遵循以下步骤。
步骤 | 实现 |
---|---|
从基类继承 |
classdefMyDatastore < matlab.io.Datastore属性(Access = private) CurrentFileIndex双文件集matlab.io.datastore.DsFileSet结束 |
添加此属性可在一台机器上创建一个数据存储,该数据存储可在可能具有不同文件系统或操作系统的另一台机器或集群上无缝工作。 在方法部分添加获取和设置此属性的方法。 |
属性来支持的保存、加载和处理%的数据存储在不同的文件系统机器或集群上。此外,定义方法get.AlternateFileSystemRoots()%,并在方法部分设置. alternatefilesystemroots()。(依赖)AlternateFileSystemRoots属性结束 |
实现的功能 |
方法%开始方法节函数myds = MyDatastore(location,altRoots)文件集= matlab.io.datastore.DsFileSet(location,...“FileExtensions”,“。斌”,...“FileSplitSize”8 * 1024);myds。CurrentFileIndex = 1;如果Nargin == 2 myds。AlternateFileSystemRoots = altRoots;结束重置(myds);结束 |
实现 |
函数tf = hasdata (myds)%如果有更多数据,返回true。tf = hasfile (myds.FileSet);结束 |
实现 这种方法使用 |
函数(数据、信息)=阅读(myds)读取数据和关于提取数据的信息。如果~ hasdata (myds)错误(sprintf ([“没有更多的数据要读了。\nUse reset ',...方法将数据存储重置为'的开头。,...的数据。在调用read方法之前,',...'检查数据是否可用',...'使用hasdata方法。')))结束fileInfoTbl = nextfile (myds.FileSet);data = MyFileReader (fileInfoTbl);信息。大小=大小(数据);信息。文件名= fileInfoTbl.FileName;信息。抵消= fileInfoTbl.Offset;%更新CurrentFileIndex以跟踪进度如果fileInfoTbl。抵消+ fileInfoTbl。SplitSize > =...fileInfoTbl。文件大小myds。CurrentFileIndex = myds。CurrentFileIndex + 1;结束结束 |
实现 |
函数重置(myds)重置到数据的开始。重置(myds.FileSet);myds。CurrentFileIndex = 1;结束 |
属性的获取和设置方法 目录中的数据存储必须重置 |
在定义这些方法之前,添加alternatefilesystemroot属性部分中的%属性AlternateFileSystemRoots属性的Getter函数altRoots = get.AlternateFileSystemRoots(myds) altRoots = myds. fileset . alternatefilesystemroots;结束%设置AlternateFileSystemRoots属性函数set.AlternateFileSystemRoots (myds altRoots)试一试DsFileSet对象管理alternatefilesystemroot%为您的数据存储myds.FileSet.AlternateFileSystemRoots = altRoots;重置数据存储重置(myds);抓我把(我);结束结束结束 |
实现 |
方法(隐藏= true)函数压裂=进步(myds)确定从数据存储中读取的数据的百分比如果hasdata(myds) frac = (myds. currentfileindex -1)/...myds.FileSet.NumFiles;其他的压裂= 1;结束结束结束 |
实现 |
方法(Access = protected)如果使用DsFileSet对象作为属性,则您必须定义copyElement方法。的copyElement方法允许读取和预览等方法%是无状态的函数dscopy = copyElement(ds) dscopy = copyElement@matlab.mixin.Copyable(ds);dscopy。文件集= (ds.FileSet)复印件;结束结束 |
结束 |
结束
|
创建功能读取您的专有文件格式
实施读
方法使用的函数称为MyFileReader
.必须创建此函数来读取自定义或专有数据。使用以下命令构建此函数DsFileReader
对象及其方法。例如,创建一个读取二进制文件的函数。
函数data = MyFileReader (fileInfoTbl)%使用FileName创建一个读取器对象读者= matlab.io.datastore.DsFileReader (fileInfoTbl.FileName);寻求抵消寻求(读者,fileInfoTbl。抵消,“起源”,“start-of-file”);% fileInfoTbl阅读。SplitSize数据量data =阅读(读者,fileInfoTbl.SplitSize);结束
增加对并行处理的支持
使用“并行计算工具箱”和添加对并行处理的支持MATLAB并行服务器,更新您的实现代码MyDatastore.m
:
定义两个额外的方法:
maxpartitions
而且分区
.
对于示例实现,请遵循以下步骤。
步骤 | 实现 |
---|---|
更新 |
classdefMyDatastore < matlab.io.Datastore &...datastore.可分区… |
添加定义 |
方法……函数Subds = partition(myds,n,ii);再分。文件集=分区(myds.FileSet n ii);重置(再分);结束结束 |
添加定义 |
方法(Access = protected)函数n = maxpartitions(myds. fileset);结束结束 |
结束 |
结束
|
增加对Hadoop的支持
要添加对Hadoop的支持,更新您的实现代码MyDatastore.m
:
定义两个额外的方法:
getLocation
而且initializeDatastore
.
对于示例实现,请遵循以下步骤。
步骤 | 实现 |
---|---|
更新 |
classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore. hadoop plocationbased… |
添加定义 |
方法(隐藏=真)…函数initializeDatastore (myds hadoopInfo)导入matlab.io.datastore.DsFileSet;myds。文件集= DsFileSet (hadoopInfo,...“FileSplitSize”, myds.FileSet.FileSplitSize);重置(myds);结束函数loc = getLocation(myds);结束% isfullfile方法是可选的函数tf = isfullfile(myds) tf = isequal(myds. fileset . filesplitsize,“文件”);结束结束 |
结束 |
结束
|
增加对洗牌的支持
中更新您的实现代码以添加对洗牌的支持MyDatastore.m
:
从额外的类继承
matlab.io.datastore.Shuffleable
.定义附加方法
洗牌
.
对于示例实现,请遵循以下步骤。
步骤 | 实现 |
---|---|
更新 |
classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore.Shuffleable… |
添加定义 |
方法%先前定义的方法。函数dsNew = shuffle (ds)% dsNew = shuffle(ds)洗牌文件和%对应的标签在数据存储。创建数据存储的副本dsNew = (ds)复印件;dsNew。数据存储= (ds.Datastore)复印件;fds = dsNew.Datastore;打乱文件和相应的标签numObservations = dsNew.NumObservations;idx = randperm (numObservations);fds。文件= fds.Files (idx);dsNew。标签= dsNew.Labels (idx);结束结束 |
结束 |
结束
|
增加写数据支持
中添加对写入数据的支持,请更新实现代码MyDatastore.m
要遵循这些要求:
从额外的类继承
matlab.io.datastore.FileWritable
.实现一个
写
方法,如果数据存储将数据写入自定义格式。实现一个
getfile
方法,如果数据存储没有文件
财产。实现一个
getFolders
方法,如果数据存储没有文件夹
财产。输出位置被验证为字符串。如果数据存储需要进一步验证,则必须实现
validateOutputLocation
方法。如果数据存储用于每个文件需要多次读取的文件,则必须实现这些方法
getCurrentFilename
而且currentFileIndexComparator
.可选地,从另一个类继承
matlab.io.datastore.FoldersPropertyProvider
添加对的支持文件夹
属性(因此FolderLayout
名称-值对的writeall
).如果您这样做,那么您可以使用populateFoldersFromLocation
方法中填充文件夹
财产。的支持
“UseParallel”
选择writeall
,您必须从两者继承matlab.io.datastore.FileWritable
而且matlab.io.datastore.Partitionable
并实现分区
方法中支持该语法的子类分区(ds,‘文件’,指数)
.
的示例实现matlab.io.datastore.FileWritable
,遵循以下步骤。
步骤 | 实现 |
---|---|
更新 |
classdefMyDatastore < matlab.io.Datastore &...matlab.io.datastore.FileWritable… |
初始化属性 |
SupportedOutputFormats = . properties (Constant...[matlab.io.datastore.ImageDatastore.SupportedOutputFormats,“dcm”];DefaultOutputFormat =“dcm”;结束 |
添加定义 |
方法(Access = protected)函数files = getFiles(ds) files = {“数据/文件夹/ file1”,“数据/文件夹/ file2”,...};结束函数文件夹= getFolders(ds)文件夹= {“数据/ folder1 /”,“数据/ folder2 /”,...};结束结束 |
添加一个 |
方法(访问=保护)函数tf = write(myds, data, writeInfo, outFmt, varargin)如果outFmt = =“dcm”%使用自定义写FCN为DCM格式writeInfo dicomwrite(数据。SuggestedOutputName,变长度输入宗量{:});其他的%回调到内置的已知格式write@matlab.io.datastore.FileWritable (myds、数据...writeInfo outFmt,变长度输入宗量{:});结束tf = true;结束结束 |
结束 |
结束
|
从两者继承的更长的示例类matlab.io.datastore.FileWritable
而且matlab.io.datastore.FoldersPropertyProvider
,请参阅为DICOM数据开发自定义数据存储.
验证自定义数据存储
按照这里给出的说明操作之后,自定义数据存储的实现步骤就完成了。在使用此自定义数据存储之前,请使用中给出的准则对其进行限定自定义数据存储测试指南.
另请参阅
matlab.io.Datastore
|matlab.io.datastore.Partitionable
|matlab.io.datastore.HadoopLocationBased
|matlab.io.datastore.Shuffleable
|matlab.io.datastore.DsFileSet
|matlab.io.datastore.DsFileReader
|matlab.io.datastore.FoldersPropertyProvider
|matlab.io.datastore.FileWritable