主要内容

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/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File01.mf4';
                                '/tmp/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File02.mf4';
                                '/tmp/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File03.mf4'
                                 ... and 2 more
                                }
                 ChannelGroups: 
                                  GroupNumber    AcquisitionName       Comment           ... and 10 more columns    
                                  ___________    _______________    _____________                

                                       1           <undefined>      Integer Types                
                                       2           <undefined>      Float Types                  


                      Channels: 
                                        Name           GroupNumber    DisplayName        ... and 17 more columns    
                                  _________________    ___________    ___________                

                                  "Float_32_LE"             2             ""                     
                                  "Float_64_LE"             2             ""                     
                                  "Signed_Int16_LE"         1             ""                     

                                ... and 3 more rows

  Options
          SelectedChannelNames: {
                                'Signed_Int16_LE';
                                'Unsigned_UInt32_LE';
                                'time'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: "file"
                       ReadRaw: 0
                  ValidityRule: "include"
                 IncludeEvents: 1

配置 MDF 数据存储

可通过多个选项控制从 MDF 文件读取的数据以及执行读取的方式。在本例中,默认使用第一个通道组。请注意,数据存储一次只能选择一个通道组。您还可以指定在所选通道组中读取特定通道。本例中默认读取所有通道。

mds.SelectedChannelGroupNumber
ans = 
1
mds.SelectedChannelNames
ans = 3×1 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             246364  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             246364  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             246364  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/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File01.mf4';
                                '/tmp/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File02.mf4';
                                '/tmp/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File03.mf4'
                                 ... and 2 more
                                }
                 ChannelGroups: 
                                  GroupNumber    AcquisitionName       Comment           ... and 10 more columns    
                                  ___________    _______________    _____________                

                                       1           <undefined>      Integer Types                
                                       2           <undefined>      Float Types                  


                      Channels: 
                                        Name           GroupNumber    DisplayName        ... and 17 more columns    
                                  _________________    ___________    ___________                

                                  "Float_32_LE"             2             ""                     
                                  "Float_64_LE"             2             ""                     
                                  "Signed_Int16_LE"         1             ""                     

                                ... and 3 more rows

  Options
          SelectedChannelNames: {
                                'Signed_Int16_LE';
                                'Unsigned_UInt32_LE';
                                'time'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 5
                       ReadRaw: 0
                  ValidityRule: "include"
                 IncludeEvents: 1

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/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File01.mf4';
                                '/tmp/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File02.mf4';
                                '/tmp/Bdoc25b_2988451_1430519/tpe4ace63d/vnt-ex10761765/File03.mf4'
                                 ... and 2 more
                                }
                 ChannelGroups: 
                                  GroupNumber    AcquisitionName       Comment           ... and 10 more columns    
                                  ___________    _______________    _____________                

                                       1           <undefined>      Integer Types                
                                       2           <undefined>      Float Types                  


                      Channels: 
                                        Name           GroupNumber    DisplayName        ... and 17 more columns    
                                  _________________    ___________    ___________                

                                  "Float_32_LE"             2             ""                     
                                  "Float_64_LE"             2             ""                     
                                  "Signed_Int16_LE"         1             ""                     

                                ... and 3 more rows

  Options
          SelectedChannelNames: {
                                'Signed_Int16_LE';
                                'Unsigned_UInt32_LE';
                                'time'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 5 sec
                       ReadRaw: 0
                  ValidityRule: "include"
                 IncludeEvents: 1

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