主要内容

matlab.io.Datastore类

包:matlab.io

基本数据存储类

描述

matlab.io.Datastore用于创建自定义数据存储的抽象类。数据存储有助于迭代地访问大型数据集合,特别是当数据太大而无法装入内存时。的数据存储抽象类声明并捕获MATLAB中所有自定义数据存储所需的接口®.使用以下语法派生你的类:

classdefMyDatastore< matlab.io.Datastore…结束

要实现自定义数据存储:

有关创建自定义数据存储的详细信息和步骤,请参见开发自定义数据存储

方法

从数据存储中读取数据。

[data,info] = read(ds)

数据输出可以是任何数据类型,并且必须是垂直连接的。的最佳做法是返回信息输出为结构。

输出的数据类型数据属性的输出的数据类型函数。

访问:公共文摘:真正的

hasdata

确定是否有数据可以读取。输出是逻辑类型的。

Tf = hasdata(ds)

访问:公共文摘:真正的

重置

在读取任何数据之前,将数据存储重置为初始状态。

重置(ds)

访问:公共文摘:真正的

进步

确定已经读取了多少数据。

输出是一个标量double between0而且1.返回值为0.55说明你已经读过了55%数据的。

P =进度(ds)

访问:公共文摘:真正的隐藏:真

预览

返回数据的子集。

数据=预览(ds)

默认实现返回前八行数据。的输出具有与输出相同的数据类型

方法的默认实现预览方法没有针对高阵列结构进行优化。要提高高数组性能,请根据数据优化实现。

访问:公共

readall

读取数据存储中的所有数据。

数据= readall(ds)

的输出具有与输出相同的数据类型.如果数据不适合内存,readall返回一个错误。

方法的默认实现readall方法没有针对高阵列结构进行优化。要提高高数组性能,请根据数据优化实现。

访问:公共

结合

组合来自多个数据存储的数据。

dsnew = combine(ds1,ds2,…)

输出dsnew是一个新的数据存储与组合数据,返回作为CombinedDatastore对象。使用ReadOrder = "序列"参数返回SequentialDatastore对象,按顺序读取数据。

访问:公共

变换

转换数据存储。

Dsnew = transform(ds,@fcn)

输出dsnew是一个新的数据存储转换的数据,返回作为TransformedDatastore对象。

访问:公共

isPartitionable

确定数据存储是否可分区。输出是逻辑类型的。

tf = isPartitionable(ds)

访问:公共

isSubsettable

确定数据存储是否可子集。输出是逻辑类型的。

tf = isSubsettable(ds)

访问:公共

isShuffleable

确定数据存储是否可洗牌。输出是逻辑类型的。

tf = isShuffleable(ds)

访问:公共

属性

要向自定义数据存储添加句柄属性,必须实现copyElement方法。例如,如果你使用DsFileSet对象作为自定义数据存储中的属性,然后实现copyElement方法。实现copyElement方法使您能够创建数据存储对象的深度副本。有关更多信息,请参见自定义拷贝操作.的示例实现copyElement方法,请参阅开发自定义数据存储

属性

密封

有关类属性的信息,请参见类属性

例子

全部折叠

构建一个数据存储,将您的自定义或专有数据带入MATLAB®进行串行处理。

创建一个.m类定义文件,其中包含实现自定义数据存储的代码。必须将此文件保存在工作文件夹或MATLAB®路径下的文件夹中。的名称.mFile必须与对象构造函数的名称相同。例如,如果您希望构造函数具有名称MyDatastore,则.m文件必须是MyDatastore.m.的.m类定义文件必须包含以下步骤:

  • 步骤1:从数据存储类继承。

  • 步骤2:定义构造函数和所需的方法。

  • 步骤3:定义自定义文件读取函数。

除了这些步骤之外,还需要定义处理和分析数据所需的任何其他属性或方法。

步骤1:从数据存储类继承classdefMyDatastore < matlab.io.Datastore属性(Access = private) CurrentFileIndex文件集matlab.io.datastore.DsFileSet结束属性支持的保存、加载和处理金宝app%数据存储在不同的文件系统机器或集群上。此外,定义get.AlternateFileSystemRoots()方法%和方法部分中的set.AlternateFileSystemRoots()。属性(依赖)AlternateFileSystemRoots结束步骤2:定义构造函数和所需的方法方法定义您的数据存储构造函数函数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)%如果有更多可用数据则返回truetf = hasfile(myds.FileSet);结束定义读取方法函数[data,info] = read(myds)读取数据和提取数据的相关信息请参见:MyFileReader()如果~ 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属性的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;结束结束结束方法(访问=受保护)如果在数据存储中使用FileSet属性,%,则必须定义copyElement方法。的% copyElement方法允许readall等方法%和预览保持无状态函数dscopy = copyElement(ds) dscopy = copyElement@matlab.mixin.Copyable(ds);dscopy。FileSet = copy(ds.FileSet);结束结束结束步骤3:实现您的自定义文件读取功能函数data = MyFileReader(fileInfoTbl)使用FileName创建读取器对象reader = matlab.io.datastore.DsFileReader(fileInfoTbl.FileName);寻求抵消寻求(读者,fileInfoTbl。抵消,“起源”“start-of-file”);% read fileInfoTbl. %SplitSize数据量data = read(reader,fileInfoTbl.SplitSize);结束

自定义数据存储现在已经准备好了。使用MyDatastore创建用于读取二进制数据文件的数据存储对象。

使用自定义数据存储预览和读取您的专有数据到MATLAB串行处理。

本例使用一个简单的数据集来演示使用自定义数据存储的工作流。该数据集是15个二进制(。斌)文件,其中每个文件包含一个列(1变量)和10000无符号整数行(记录)。

dir (“*。斌”
Binary_data01.bin binary_data02.bin binary_data03.bin binary_data05.bin binary_data05.bin binary_data06.bin binary_data07.bin binary_data08.bin binary_data09.bin binary_data10.bin binary_data11.bin binary_data12.bin binary_data13.bin binary_data14.bin binary_data15.bin binary_data05.bin binary_data05.bin binary_data05.bin binary_data05.bin binary_data05.bin binary_data05.bin binary_data09.bin binary_data11.bin binary_data12.bin binary_data13.bin binary_data14.bin binary_data15.bin

方法创建数据存储对象MyDatastore函数。有关的实施详情MyDatastore,见示例构建数据存储来读取二进制文件

文件夹= fullfile(“*。斌”);ds = MyDatastore(文件夹);

预览来自数据存储的数据。

预览(ds)
ans =8x1 uint8列向量113 180 251 91 29 66 254 214

读取中的数据循环并使用hasdata方法检查是否有更多数据可读取。

Hasdata (ds) data = read(ds);%做某事结束

将数据存储重置为初始状态,并从数据存储的起始位置读取数据。

重置(ds);数据=读取(ds);

或者,如果数据集合适合内存,则读取数据存储中的所有数据。因为文件夹包含15文件10000记录在每个文件中,输出的大小应该是150000记录。

dataAll = readall(ds);谁dataAll
名称大小字节类属性dataAll 150000x1 150000 uint8 .

创建自定义数据存储对象,保存在Windows上®然后在Linux上加载和处理它®机器。

在创建和保存自定义数据存储之前,确定数据在不同平台上的根路径。根路径因机器或文件系统而异。例如,如果您使用这些根路径访问数据:

  • “Z: \数据集”在您的本地Windows机器上

  • “nfs-bldg001 /数据集”在Linux集群上

方法将这些根路径关联起来AlternateFileSystemRoots财产。有关的实施详情MyDatastore,见示例构建数据存储来读取二进制文件

altRoots = [“Z: \数据集”“nfs-bldg001 /数据集”];ds = MyDatastore(“数据集Z: \ \ *。斌”, altRoots);

检查数据存储中的文件。

fileTbl = resolve(ds.Fileset);fileTbl。文件名
ans = 12×1 cell array {'Z:\数据集\binary_data01.bin'} {'Z:\数据集\binary_data02.bin'} {'Z:\数据集\binary_data03.bin'}…

保存数据存储。

保存ds_saved_on_Windows.matds

在Linux平台上加载数据存储并检查数据存储中的文件。因为根路径Z: \数据集的加载时在Linux集群上不可访问,则数据存储功能会自动根据AlternateFileSystemRoots财产。

负载ds_saved_on_Windows.matfileTbl = resolve(ds.Fileset);fileTbl。文件名
ans = 12×1 cell array {'/nfs-bldg001/DataSet/binary_data01.bin'} {'/nfs-bldg001/DataSet/binary_data02.bin'} {'/nfs-bldg001/DataSet/binary_data03.bin'}…
现在可以在Linux机器上处理和分析这个数据存储。

版本历史

在R2017b中引入