本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。

通过 MDF 数据存储使用 MDF 文件

以下示例说明如何使用 Vehicle Network Toolbox 的 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:

                         Files: {
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File01.mf4';
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File02.mf4';
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File03.mf4'
                                 ... and 2 more
                                }
                 ChannelGroups: 
                                ChannelGroupNumber    AcquisitionName        Comment        ... and 4 more columns
                                __________________    _______________    _______________        

                                        1                   ''           'Integer Types'      
                                        2                   ''           'Float Types'        


                      Channels: 
                                ChannelGroupNumber                ChannelName                 DisplayName    ... and 9 more columns
                                __________________    ____________________________________    ___________        

                                        1             'Sigend_Int16_LE_Offset_32'                 ''           
                                        1             'Unsigend_UInt32_LE_Master_Offset_0'        ''           
                                        2             'Float_32_LE_Offset_64'                     ''           

                                ... and 1 more rows
          SelectedChannelNames: {
                                'Sigend_Int16_LE_Offset_32';
                                'Unsigend_UInt32_LE_Master_Offset_0'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 'file'

配置 MDF 数据存储

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

mds.SelectedChannelGroupNumber
mds.SelectedChannelNames
ans =

     1


ans = 

  2×1 string array

    "Sigend_Int16_LE_Offset_32"
    "Unsigend_UInt32_LE_Master_Offset_0"

MDF 数据存储预览

使用 preview 函数,可以快速查看文件集中可用的数据。预览始终从数据存储中的第一个文件返回最多八个数据点。

preview(mds)
ans =

  8×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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 函数在一次调用中读取数据的全部内容。当可用内存能够容纳数据集时,这是从许多文件中读取数据的高效方法。运行 readall 后,数据存储将重置到数据集的开头。

data = readall(mds);
data(1:5,:)
ans =

  5×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    0 sec                0                                0                 
    1 sec                1                                1                 
    2 sec                2                                2                 
    3 sec                3                                3                 
    4 sec                4                                4                 

对 MDF 数据存储调用 read 函数

您可以使用 read 函数从文件集中获取数据。默认情况下,每次对 MDF 数据存储调用 read 将读取单个文件包含的全部数据量。数据存储的强大功能来自在文件集中按顺序读取多个文件。在您读取时,数据存储会自动从一个文件桥接到下一个文件,直到读取了所有文件中的所有数据。

for ii = 1:3
    data = read(mds);
    whos('data')
    data(1:5,:)
end
  Name          Size             Bytes  Class        Attributes

  data      10000x2             241767  timetable              


ans =

  5×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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             241767  timetable              


ans =

  5×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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             241767  timetable              


ans =

  5×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    0 sec                0                                0                 
    1 sec                1                                1                 
    2 sec                2                                2                 
    3 sec                3                                3                 
    4 sec                4                                4                 

对 MDF 数据存储调用 reset 函数

您可以随时调用 reset 函数以在数据集的开头重新开始。

reset(mds)

配置为按数据记录读取 MDF 数据存储

您可以使用 ReadSize 属性指定每次调用时要读取的数据量。ReadSize 可以指定为数值以读取固定数量的数据点。通过 ReadSize,您可以控制在数据集大于可用内存时将多少数据加载到内存中。我们推荐使用满足以下条件的自定义读取大小:足够小以便能放入内存,同时尽可能大以降低处理开销并提高性能。

mds.ReadSize = 5
for ii = 1:3
    data = read(mds)
end
mds = 

  MDFDatastore with properties:

                         Files: {
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File01.mf4';
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File02.mf4';
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File03.mf4'
                                 ... and 2 more
                                }
                 ChannelGroups: 
                                ChannelGroupNumber    AcquisitionName        Comment        ... and 4 more columns
                                __________________    _______________    _______________        

                                        1                   ''           'Integer Types'      
                                        2                   ''           'Float Types'        


                      Channels: 
                                ChannelGroupNumber                ChannelName                 DisplayName    ... and 9 more columns
                                __________________    ____________________________________    ___________        

                                        1             'Sigend_Int16_LE_Offset_32'                 ''           
                                        1             'Unsigend_UInt32_LE_Master_Offset_0'        ''           
                                        2             'Float_32_LE_Offset_64'                     ''           

                                ... and 1 more rows
          SelectedChannelNames: {
                                'Sigend_Int16_LE_Offset_32';
                                'Unsigend_UInt32_LE_Master_Offset_0'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 5


data =

  5×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    ______    _________________________    __________________________________

    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)
for ii = 1:3
    data = read(mds)
end
mds = 

  MDFDatastore with properties:

                         Files: {
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File01.mf4';
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File02.mf4';
                                ' ...\home\jpyle\documents\MATLAB\examples\vnt-ex10761765\File03.mf4'
                                 ... and 2 more
                                }
                 ChannelGroups: 
                                ChannelGroupNumber    AcquisitionName        Comment        ... and 4 more columns
                                __________________    _______________    _______________        

                                        1                   ''           'Integer Types'      
                                        2                   ''           'Float Types'        


                      Channels: 
                                ChannelGroupNumber                ChannelName                 DisplayName    ... and 9 more columns
                                __________________    ____________________________________    ___________        

                                        1             'Sigend_Int16_LE_Offset_32'                 ''           
                                        1             'Unsigend_UInt32_LE_Master_Offset_0'        ''           
                                        2             'Float_32_LE_Offset_64'                     ''           

                                ... and 1 more rows
          SelectedChannelNames: {
                                'Sigend_Int16_LE_Offset_32';
                                'Unsigend_UInt32_LE_Master_Offset_0'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 5 sec


data =

  5×2 timetable

    Time     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    _____    _________________________    __________________________________

    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     Sigend_Int16_LE_Offset_32    Unsigend_UInt32_LE_Master_Offset_0
    ______    _________________________    __________________________________

    10 sec               10                                10                
    11 sec               11                                11                
    12 sec               12                                12                
    13 sec               13                                13                
    14 sec               14                                14