fileDatastore
具有自定义文件读取器的数据存储
说明
对于不一定能放入内存的大型自定义格式文件集合或者不能放入内存的大型自定义格式文件,可以使用 FileDatastore 对象来管理。您可以使用 fileDatastore 函数创建 FileDatastore 对象,指定其属性,然后使用对象函数导入和处理数据。
创建对象
语法
描述
输入参量
要包含在数据存储中的文件或文件夹,指定为以下值之一:
FileSet对象 - 与指定路径或DsFileSet对象相比,将位置指定为FileSet对象会加快数据存储的构造时间。有关详细信息,请参阅matlab.io.datastore.FileSet。DsFileSet对象 - 有关详细信息,请参阅matlab.io.datastore.DsFileSet。文件路径 - 您可以将单个文件路径指定为字符串标量或字符向量。您可以将多个文件路径指定为字符串数组或字符向量元胞数组。
文件或文件夹可以是本地或远程的:
本地文件或文件夹 - 如果文件不在当前文件夹中,则指定完整路径或相对路径。指定文件夹的子文件夹中的文件不会自动包括在数据存储中。在指定本地路径时可以使用通配符 (*)。此字符指定数据存储包含所有匹配的文件或匹配文件夹中的所有文件。
远程文件或文件夹 - 将远程文件或文件夹的完整路径指定为
hdfs:///形式的统一资源定位器 (URL)。Internet URL 必须包含协议类型path_to_file"http://"或"https://"。在 URL 的任何位置使用通配符指定多个远程文件 (自 R2025a 起)。有关详细信息,请参阅处理远程数据。
当您指定文件夹时,数据存储仅包括具有支持的文件格式的文件,而忽略任何其他格式的文件。要指定要包含在数据存储中的自定义文件扩展名列表,请参阅 FileExtensions 名称-值参量。
示例: "file1.ext"
示例: "../dir/data/file1.ext"
示例: ["C:\dir\data\file1.exts","C:\dir\data\file2.extx"]
示例: "C:\dir\data\*.ext"
读取文件数据的函数,指定为函数句柄。
由函数句柄 @fcn 表示的函数签名取决于指定的 ReadMode 的值。读取文件数据的函数必须符合下列签名之一。
|
|
|---|---|
"file"(默认值) | 函数必须具有以下签名: function data = MyReadFcn(filename) ... end
|
"partialfile" | 函数必须具有以下签名: function [data,userdata,done] = MyReadFcn(filename,userdata) ... end
|
"byte" | 函数必须具有以下签名: function data = MyReadFcn(filename,offset,size) ... end
|
@fcn 中指定的值将设置 ReadFcn 属性的值。
示例: @customreader
数据类型: function_handle
名称-值参数
以 Name1=Value1,...,NameN=ValueN 的形式指定可选参量对组,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
示例: fds = fileDatastore("C:\dir\data",FileExtensions=[".exts",".extx"])
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。
示例: fds = fileDatastore("C:\dir\data","FileExtensions",[".exts",".extx"])
子文件夹包含标记,指定为以逗号分隔的对组,其中包含 "IncludeSubfolders" 以及 true、false、0 或 1。指定 true 可包含每个文件夹中的所有文件和子文件夹,指定 false 则仅包含每个文件夹中的文件。
如果不指定 "IncludeSubfolders",则默认值为 false。
示例: "IncludeSubfolders",true
数据类型: logical | double
自定义格式的文件扩展名,指定为以逗号分隔的对组,其中包含 "FileExtensions" 和一个字符向量、字符向量元胞数组、字符串标量或字符串数组。
如果您指定了文件扩展名,fileDatastore 函数将只为具有指定扩展名的文件创建数据存储对象。您还可以通过将 "FileExtensions" 指定为空字符向量 '',为没有任何扩展名的文件创建数据存储。如果不指定 "FileExtensions",fileDatastore 会自动将所有文件包含在一个文件夹中。
示例: "FileExtensions",''
示例: "FileExtensions",".ext"
示例: "FileExtensions",[".exts",".extx"]
数据类型: char | cell | string
用于预览输入数据的函数,指定为函数句柄。
如果未指定预览函数,FileDatastore 将使用 @ReadFcn 中指定的值作为默认预览函数。您也可以为数据指定自己的自定义预览函数。
@ReadFcn(默认值)- 使用ReadFcn对FileDatastore数据进行采样。此选项会导致tall构造的性能下降。Function handle- 对FileDatastore和tall构造使用自定义预览函数来对输入数据进行采样。使用PreviewFcn提供一个函数,该函数只读取预览和 tall 构造所需的最少的输入数据部分。
PreviewFcn 指定的函数必须返回与 ReadFcn 返回的数据类型相同的值。
数据类型: function_handle
要读取的文件部分,指定为 "file"、"partialfile" 或 "bytes"。
"file"(默认值) | 如果您在 根据您的自定义读取函数,文件数据存储会在每次调用 |
"partialfile" | 如果您在 根据您的自定义读取函数,每次调用 在 |
"bytes" | 如果您在
根据您的自定义读取函数,每次调用读取函数时,文件数据存储都会读取 |
要对 FileDatastore 对象使用 subset 和 shuffle 函数,必须将 "ReadMode" 设置为 "file"。
数据类型: char | string
每次 read 操作要读取的字节数,指定为正整数。
为了确保您可以在多个并行的 MATLAB® 工作单元之间分发文件的多个块,请将 BlockSize 指定为大于 131072 字节 (128 KB) 的正整数。
要指定或更改 BlockSize 的值,您必须首先将 ReadMode 设置为 "bytes"。FileDatastore 根据在 ReadMode 中指定的值设置 BlockSize 的默认值。
如果
ReadMode是"file"或"partialfile",则FileDatastore将BlockSize的默认值设置为inf。如果
ReadMode是"bytes",则FileDatastore将BlockSize的默认值设置为128MB。
备用文件系统根路径,以名称-值参量形式指定,其中包含 "AlternateFileSystemRoots" 和一个字符串向量或元胞数组。当您在本地计算机上创建数据存储,但需要访问和处理另一台计算机(可能是不同操作系统)上的数据时,请使用 "AlternateFileSystemRoots"。此外,如果您使用 Parallel Computing Toolbox™ 和 MATLAB Parallel Server™ 处理数据,而数据存储在本地计算机上并且在不同平台云或集群计算机上存储数据副本,则必须使用 "AlternateFileSystemRoots" 关联根路径。
要关联一组等效的根路径,请将
"AlternateFileSystemRoots"指定为字符串向量。例如,["Z:\datasets","/mynetwork/datasets"]
要将在数据存储方面等效的多组根路径关联起来,请将
"AlternateFileSystemRoots"指定为包含多个行的元胞数组,其中每一行代表一组等效的根路径。将元胞数组中的每一行指定为一个字符串向量或字符向量元胞数组。例如:将
"AlternateFileSystemRoots"指定为字符串向量元胞数组。{["Z:\datasets", "/mynetwork/datasets"];... ["Y:\datasets", "/mynetwork2/datasets","S:\datasets"]}也可以将
"AlternateFileSystemRoots"指定为字符向量元胞数组。{{'Z:\datasets','/mynetwork/datasets'};... {'Y:\datasets', '/mynetwork2/datasets','S:\datasets'}}
"AlternateFileSystemRoots" 的值必须满足以下条件:
包含一行或多行,每一行指定一组等效的根路径。
每一行指定多个根路径,每个根路径必须至少包含两个字符。
根路径是唯一的,并且不是彼此的子文件夹。
包含至少一个指向文件位置的根路径条目。
有关详细信息,请参阅Set Up Datastore for Processing on Different Machines or Clusters。
示例: ["Z:\datasets","/mynetwork/datasets"]
数据类型: string | cell
属性
FileDatastore 属性用于描述与 FileDatastore 对象关联的文件。除了 Files 属性,您还可以使用名称-值对组参量指定 FileDatastore 属性的值。要在创建对象后查看或修改属性,请使用圆点表示法。
包含在数据存储中的文件,解析为字符向量、字符向量元胞数组、字符串标量或字符串数组,其中每个字符向量或字符串表示文件的一个完整路径。创建数据存储时,fileDatastore 和 datastore 函数中的 location 参量用来定义 Files。
示例: {"C:\dir\data\file1.ext";"C:\dir\data\file2.ext"}
示例: "hdfs:///data/*.mat"
数据类型: char | cell | string
此 属性 为只读。
用于构造数据存储的文件夹,以字符向量元胞数组形式返回。该元胞数组定向为一个列向量。每个字符向量均为指向一个包含数据文件的文件夹的路径。创建数据存储时,fileDatastore 和 datastore 函数中的 location 参量用来定义 Folders。
当您修改 FileDatastore 对象的 Files 属性时,将重置 Folders 属性。
数据类型: cell
数据类型: function_handle
此 属性 为只读。
可垂直串联标志,指定为逻辑值 true 或 false。此属性的值在您首次创建 FileDatastore 对象时指定。
true | 多次读取 当
|
false(默认值) | 多次读取 当
|
示例: fds = fileDatastore(location,"ReadFcn",@load,"UniformRead",true)
数据类型: logical | double
此 属性 为只读。
支持写入的格式,以字符串组成的行向量形式返回。此属性指定使用 writeall 从数据存储写入输出文件时可能的输出格式。
对象函数
hasdata | 确定是否有数据可读取 |
numpartitions | 数据存储分区数 |
partition | 划分数据存储 |
preview | 预览数据存储中的数据子集 |
read | 读取数据存储中的数据 |
readall | 读取数据存储中的所有数据 |
writeall | 将数据存储写入文件 |
reset | 将数据存储重置为初始状态 |
transform | 变换数据存储 |
combine | 合并来自多个数据存储的数据 |
isPartitionable | 确定数据存储是否可分区 |
isSubsettable | Determine whether datastore is subsettable |
isShuffleable | 确定数据存储是否可乱序 |
shuffle | 对数据存储中的所有数据进行乱序处理 |
subset | 创建数据存储或 FileSet 的子集 |
示例
使用 FileSet 对象或文件路径创建一个 fileDatastore 对象。
创建一个 FileSet 对象。创建一个 fileDatastore 对象。
fs = matlab.io.datastore.FileSet("fluidtemp.mat"); fds = fileDatastore(fs,"ReadFcn",@load)
fds =
FileDatastore with properties:
Files: {
' ...\matlab\toolbox\matlab\demos\fluidtemp.mat'
}
Folders: {
'...\matlab\toolbox\matlab\demos'
}
UniformRead: 0
ReadMode: 'file'
BlockSize: Inf
PreviewFcn: @load
SupportedOutputFormats: ["txt" "csv" "dat" "asc" "xlsx" "xls" "parquet" "parq" "png" … ] (1×20 string)
ReadFcn: @load
AlternateFileSystemRoots: {}
您也可以使用文件路径来创建 fileDatastore 对象。
fds = fileDatastore("fluidtemp.mat","ReadFcn",@load);
创建一个数据存储,其中包含 MATLAB® demos 文件夹中的所有 .mat 文件,并指定 load 函数读取文件数据。
fds = fileDatastore(fullfile(matlabroot,"toolbox","matlab","demos"),"ReadFcn",@load,"FileExtensions",".mat")
fds =
FileDatastore with properties:
Files: {
'...\matlab\toolbox\matlab\demos\accidents.mat';
'...\matlab\toolbox\matlab\demos\airfoil.mat';
' ...\matlab\toolbox\matlab\demos\airlineResults.mat'
... and 38 more
}
Folders: {
'...\matlab\toolbox\matlab\demos'
}
UniformRead: 0
ReadMode: 'file'
BlockSize: Inf
PreviewFcn: @load
SupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"]
ReadFcn: @load
AlternateFileSystemRoots: {}
读取数据存储中的第一个文件,然后读取第二个文件。
data1 = read(fds); data2 = read(fds);
同时读取数据存储中的所有文件。
readall(fds);
初始化元胞数组,以保留数据和计数器 i。
dataarray = cell(numel(fds.Files), 1); i = 1;
将数据存储重置为第一个文件,然后一次读取一个文件,直到没有剩余数据。为数组 dataarray 分配数据。
reset(fds); while hasdata(fds) dataarray{i} = read(fds); i = i+1; end
您可以创建数据存储来读取不一定能放入内存的大型 MAT 文件。假设大型 MAT 文件中的每个数组都能放入可用内存,请创建一个数据存储,分三步读取和处理数据:
编写自定义读取函数,一次从 MAT 文件中读取一个数组。
设置数据存储函数的参数以执行部分读取。
一次从 MAT 文件中读取一个数组。
编写自定义函数,一次从 MAT 文件中读取一个数组。该函数必须具有 FileDatastore 的 @ReadFcn 参量中所述的签名。将此文件保存在工作文件夹或 MATLAB 路径上的文件夹中。对于本示例,此处包含自定义函数 load_variable。
type load_variable.mfunction [data,variables,done] = load_variable(filename,variables)
% If variable list is empty,
% create list of variables from the file
if isempty(variables)
variables = who('-file', filename);
end
% Load a variable from the list of variables
data = load(filename, variables{1});
% Remove the newly-read variable from the list
variables(1) = [];
% Move on to the next file if this file is done reading.
done = isempty(variables);
end
创建并设置一个包含 accidents.mat 的 FileDatastore。指定数据存储参数,以使用 "partialfile" 作为读取模式,load_variable 作为自定义读取函数。
fds = fileDatastore("accidents.mat","ReadMode","partialfile","ReadFcn",@load_variable);
使用数据存储从文件中读取前三个变量。文件 accidents.mat 包含九个变量,对 read 的每次调用都返回一个变量。因此,要获取前三个变量,请调用 read 函数三次。
data = read(fds)
data = struct with fields:
datasources: {3×1 cell}
data = read(fds)
data = struct with fields:
hwycols: 17
data = read(fds)
data = struct with fields:
hwydata: [51×17 double]
请注意,示例文件 accidents.mat 很小,可放入内存,但对于无法放入内存的大型 MAT 文件,您可以获得类似的结果。
局限性
MATLAB 不支持要求身份验证的 Internet URL。
MATLAB Online™ 支持与 Microsoft® OneDrive™ 文件和文件夹相关联的 Internet URL,而 MATLAB 的安装版本仅支持本地 OneDrive 文件。
提示
要对
FileDatastore对象使用subset和shuffle函数,必须将"ReadMode"设置为"file"。
版本历史记录
在 R2016a 中推出MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)