主要内容

matlab.io.Datastore类

包裹:matlab.io.

基本数据存储类

描述

matlab.io.Datastore是创建自定义数据存储的抽象类。数据存储有助于迭代地访问大量数据集合,尤其是当数据太大而无法适合内存时。这数据存储Abstract类声明并捕获Matlab中所有自定义数据存储所期望的接口®.使用下面的语法派生类:

classdefMyDatastore
            

要实现您的自定义数据存储:

  • 从类继承matlab.io.Datastore

  • 定义四种必需的方法:哈迪塔重置,进步

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

方法

从数据存储中读取数据。

[数据,信息] =读取(DS)

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

输出的数据类型数据决定了输出的数据类型函数。

通道:公开文摘:真正的

哈迪塔

确定数据是否可用读取。输出为逻辑类型。

tf = hasdata (ds)

通道:公开文摘:真正的

重置

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

重置(ds)

通道:公开文摘:真正的

进步

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

输出是标量双倍0.1.的返回值0.55意味着你已经读过了55%的数据。

P =进展(DS)

通道:公开文摘:真正的隐藏:真

预览

返回数据的子集。

data =预览(ds)

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

默认实施预览对于高阵列结构,不优化方法。为了提高高阵列性能,根据您的数据优化实现。

通道:公开

读物

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

DATA = READALL(DS)

输出具有与输出相同的数据类型.如果数据无法装入内存,读物返回一个错误。

默认实施读物对于高阵列结构,不优化方法。为了提高高阵列性能,根据您的数据优化实现。

通道:公开

结合

将数据与多个数据存储组合。

dsnew =组合(DS1,DS2,...,DSN)

输出dsnew新数据存储是否包含合并的数据,返回为CombinedDatastore对象。

通道:公开

变换

转换数据存储。

dsnew = transform(ds,@ fcn)

输出dsnew是一个具有变换数据的新数据存储,返回为aTransformedDatastore对象。

通道:公开

isPartitionable

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

tf = IsPartionable(DS)

通道:公开

isShufflable.

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

tf = isShuffleable (ds)

通道:公开

属性

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

属性

密封 错误的

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

例子

全部收缩

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

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

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

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

  • 步骤3:定义自定义的文件读取功能。

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

步骤1:从数据存储类继承classdefmydatastore 属性(Access = private) CurrentFileIndex文件集matlab.io.datastore.dsfileset.结尾属性支持保存、加载和处理金宝app不同文件系统计算机或群集上的%数据存储。另外,定义get.AlternateFileSystemRoots()方法方法部分中的%和set.alternatefilesystemroots()。属性(依赖)AlternateFileSystemRoots结尾步骤2:定义构造函数和所需的方法方法定义数据存储构造函数函数myds = MyDatastore(location,altRoots)文件集= matlab.io.datastore.DsFileSet(location,...“FileExtensions”'.bin'...“FileSplitSize”8 * 1024);myds.currentfileIndex = 1;如果Nargin == 2 myds。AlternateFileSystemRoots = altRoots;结尾重置(myds);结尾%定义hasdata方法函数tf = hasdata (myds)%如果有更多可用数据则返回truetf = hasfile(myds.fileset);结尾%定义读取方法函数(数据、信息)=阅读(myds)读取数据和提取数据的相关信息%另见:myfilereader()如果~ hasdata (myds)错误(sprintf ([“没有更多的数据要读了。\nUse the reset '...方法将数据存储重置为'...'数据。\ nbefore调用读取方法,'...'检查数据是否可用来读取'...'通过使用hasdata方法。')))结尾fileinfotbl = nextfile(myds.fileset);data = myfilereader(fileinfotbl);info.size = size(数据);info.filename = fileinfotbl.filename;info.offset = fileinfotbl.offset;%更新CurrentFileIndex以跟踪进度如果fileinfotbl.offset + fileinfotbl.splitsize> =...fileinfotbl.filesize myds.currentfileIndex = myds.currentfileIndex + 1;结尾结尾定义重置方法函数重置(myds)%重置到数据的开始重置(Myds.fileset);myds.currentfileIndex = 1;结尾% AlternateFileSystemRoots属性的Getter函数altRoots = get. fileset . alternatefilesystemroots (myds);结尾% Setter for AlternateFileSystemRoots属性函数set.alternatefilesystemroots(Myds,Altroots)试一试% DsFileSet对象管理AlternateFileSystemRoots%用于您的数据存储myds.FileSet.AlternateFileSystemRoots = altRoots;%重置数据存储重置(myds);我扔(我);结尾结尾结尾方法(隐藏=真)定义进度方法函数压裂=进步(myds)%确定从数据存储读取数据的百分比如果hasdata(myds) frac = (myds. currentfileindex -1)/...myds.FileSet.NumFiles;别的Frac = 1;结尾结尾结尾方法(访问=保护)%如果您在数据存储中使用FileSet属性,%则必须定义copelement方法。这% copelement方法允许像readall这样的方法%和预览保持无状态函数dscopy = copelement (ds);dscopy。文件集= (ds.FileSet)复印件;结尾结尾结尾步骤3:实现您的自定义文件读取功能函数data = myfilereader(fileinfotbl)%使用FileName创建一个读取器对象reader = matlab.io.datastore.dsfilereader(fileinfotbl.filename);寻找偏移量寻求(读者,fileInfoTbl。抵消,'起源'“start-of-file”);% fileInfoTbl阅读。SplitSize数据量data =阅读(读者,fileInfoTbl.SplitSize);结尾

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

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

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

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

属性创建数据存储对象MyDatastore函数。有关MyDatastore,请参阅示例构建数据存储读取二进制文件

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

预览数据存储区中的数据。

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

阅读中的数据循环使用哈迪塔方法检查是否有更多数据可供读取。

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

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

重置(ds);data =阅读(ds);

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

dataall = Readall(DS);谁是dataAll
Name Size Bytes Class Attributes dataAll 150000x1 150000 uint8

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

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

  • “Z: \数据集”在本地Windows计算机上

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

然后,使用AlternateFileSystemRoots财产。有关MyDatastore,请参阅示例构建数据存储读取二进制文件

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

检查数据存储中的文件。

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

保存数据存储。

节省ds_saved_on_Windows.matDS.

在Linux平台上加载数据存储,并检查数据存储中的文件。因为根路径Z: \数据集的在加载时间的Linux集群上无法访问,数据存储函数根据指定的值自动更新根路径AlternateFileSystemRoots财产。

加载ds_saved_on_Windows.matfileTbl =解决(ds.Fileset);fileTbl。文件名
ans = 12×1单元阵列{'/nfs-bldg001/dataset/binary_data01.bin'} {'/nfs-bldg001/dataset/binary_data02.bin'} {'/nfs-bldg001/dataset/binary_data03.bin'}。.。
您现在可以在Linux机器上流程和分析此数据存储。

在R2017B中介绍