MDF 数据存储快速入门
以下示例说明如何使用 Vehicle Network Toolbox™ 的 MDF 数据存储功能快速高效地处理分布在多个 MDF 文件中的一个数据集。当数据太多而无法放入内存时,此工作流也适用。
访问数据存储中的 MDF 文件
查找包含表示多个测试序列的记录信息的 MDF 文件集合。请注意,要由 MDF 数据存储作为集合使用的各 MDF 文件必须具有相同的通道组和通道内容结构体。
dir("File*.mf4")
File01.mf4 File02.mf4 File03.mf4 File04.mf4 File05.mf4
创建 MDF 数据存储
您可以通过选择一个包含 MDF 文件集合的文件夹位置来创建 MDF 数据存储。本例中使用当前工作目录中的所有文件。
mds = mdfDatastore(pwd)
mds = MDFDatastore with properties: Datastore Details Files: { '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File01.mf4'; '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File02.mf4'; '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File03.mf4' ... and 2 more } ChannelGroups: GroupNumber AcquisitionName Comment ... and 10 more columns ___________ _______________ _____________ 1 <undefined> Integer Types {0x0 double} 2 <undefined> Float Types {0x0 double} Channels: Name GroupNumber DisplayName ... and 17 more columns _________________ ___________ ___________ "Float_32_LE" 2 "" {0x0 double} "Float_64_LE" 2 "" {0x0 double} "Signed_Int16_LE" 1 "" {0x0 double} ... and 3 more rows Options SelectedChannelNames: { 'Signed_Int16_LE'; 'Unsigned_UInt32_LE'; 'time' } SelectedChannelGroupNumber: 1 ReadSize: "file" ReadRaw: 0
配置 MDF 数据存储
可通过多个选项控制从 MDF 文件读取的数据以及执行读取的方式。在本例中,默认使用第一个通道组。请注意,数据存储一次只能选择一个通道组。您还可以指定在所选通道组中读取特定通道。本例中默认读取所有通道。
mds.SelectedChannelGroupNumber
ans = 1
mds.SelectedChannelNames
ans = 3x1 string
"Signed_Int16_LE"
"Unsigned_UInt32_LE"
"time"
预览 MDF 数据存储
使用 preview
函数,可以快速查看文件集中可用的数据。预览始终从数据存储中的第一个文件返回最多八个数据点。
preview(mds)
ans=8×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
5 sec 5 5
6 sec 6 6
7 sec 7 7
读取 MDF 数据存储中的所有数据
您可以使用 readall
函数在一次调用中读取全部数据。当可用内存能够容纳数据集时,这是从许多文件中读取数据的高效方法。运行 readall
后,数据存储将重置到数据集的开头。
data = readall(mds); data(1:5,:)
ans=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
读取 MDF 数据存储中的数据子集
您可以使用 read
函数从数据存储中获取数据子集。该子集的大小由 MDF 数据存储对象的 ReadSize
属性确定。默认情况下,在一次调用中会读取整个文件中的数据。数据存储的强大功能来自在文件集中按顺序读取多个文件。在您读取时,数据存储会自动从一个文件桥接到下一个文件,直到读取了所有文件中的所有数据。
for ii = 1:3 data = read(mds); whos("data") data(1:5,:) end
Name Size Bytes Class Attributes data 10000x2 141735 timetable
ans=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
Name Size Bytes Class Attributes data 10000x2 141735 timetable
ans=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
Name Size Bytes Class Attributes data 10000x2 141735 timetable
ans=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
重置 MDF 数据存储
您可以随时调用 reset
函数以在数据集的开头重新开始。
reset(mds)
配置要从 MDF 数据存储读取的记录数
您可以使用 ReadSize
属性指定每次调用时要读取的数据量。ReadSize
可以指定为数值以读取固定数量的数据点。通过 ReadSize
,您可以控制在数据集大于可用内存时将多少数据加载到内存中。推荐使用满足以下条件的自定义读取大小:足够小以便能放入内存,同时尽可能大以降低处理开销并提高性能。
mds.ReadSize = 5
mds = MDFDatastore with properties: Datastore Details Files: { '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File01.mf4'; '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File02.mf4'; '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File03.mf4' ... and 2 more } ChannelGroups: GroupNumber AcquisitionName Comment ... and 10 more columns ___________ _______________ _____________ 1 <undefined> Integer Types {0x0 double} 2 <undefined> Float Types {0x0 double} Channels: Name GroupNumber DisplayName ... and 17 more columns _________________ ___________ ___________ "Float_32_LE" 2 "" {0x0 double} "Float_64_LE" 2 "" {0x0 double} "Signed_Int16_LE" 1 "" {0x0 double} ... and 3 more rows Options SelectedChannelNames: { 'Signed_Int16_LE'; 'Unsigned_UInt32_LE'; 'time' } SelectedChannelGroupNumber: 1 ReadSize: 5 ReadRaw: 0
for ii = 1:3 data = read(mds) end
data=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
data=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
5 sec 5 5
6 sec 6 6
7 sec 7 7
8 sec 8 8
9 sec 9 9
data=5×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
______ _______________ __________________
10 sec 10 10
11 sec 11 11
12 sec 12 12
13 sec 13 13
14 sec 14 14
配置从 MDF 数据存储读取的时间范围
您还可以将 ReadSize
指定为一段持续时间以按经过的时间来读取数据点。请注意,更改读取类型时,数据存储将重置到数据集的开头。
mds.ReadSize = seconds(5)
mds = MDFDatastore with properties: Datastore Details Files: { '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File01.mf4'; '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File02.mf4'; '/tmp/Bdoc23b_2361005_1549003/tp48e5e6a3/vnt-ex10761765/File03.mf4' ... and 2 more } ChannelGroups: GroupNumber AcquisitionName Comment ... and 10 more columns ___________ _______________ _____________ 1 <undefined> Integer Types {0x0 double} 2 <undefined> Float Types {0x0 double} Channels: Name GroupNumber DisplayName ... and 17 more columns _________________ ___________ ___________ "Float_32_LE" 2 "" {0x0 double} "Float_64_LE" 2 "" {0x0 double} "Signed_Int16_LE" 1 "" {0x0 double} ... and 3 more rows Options SelectedChannelNames: { 'Signed_Int16_LE'; 'Unsigned_UInt32_LE'; 'time' } SelectedChannelGroupNumber: 1 ReadSize: 5 sec ReadRaw: 0
for ii = 1:3 data = read(mds) end
data=6×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
_____ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
5 sec 5 5
data=11×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
______ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
5 sec 5 5
6 sec 6 6
7 sec 7 7
8 sec 8 8
9 sec 9 9
10 sec 10 10
data=16×2 timetable
time Signed_Int16_LE Unsigned_UInt32_LE
______ _______________ __________________
0 sec 0 0
1 sec 1 1
2 sec 2 2
3 sec 3 3
4 sec 4 4
5 sec 5 5
6 sec 6 6
7 sec 7 7
8 sec 8 8
9 sec 9 9
10 sec 10 10
11 sec 11 11
12 sec 12 12
13 sec 13 13
14 sec 14 14
15 sec 15 15
关闭 MDF 文件
通过从工作区中清除 MDF 数据存储变量,关闭对 MDF 文件的访问。
clear mds