Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

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