Использование MDF-файлов через MDF Datastore

В этом примере показано, как использовать функцию MDF Datastore Vehicle Network Toolbox для быстрой и эффективной обработки набора данных, распределенного по набору нескольких MDF-файлов. Этот рабочий процесс также ценен, когда слишком много данных, чтобы помещаться в доступную память.

Доступ к MDF-файлам в Datastore

Найдите набор MDF-файлов, представляющих записанную информацию из нескольких тестовых последовательностей. Обратите внимание, что MDF-файлы, которые будут использоваться MDF datastore в качестве набора, должны иметь одну и ту же структуру содержимого группы каналов и канала.

dir('File*.mf4')
File01.mf4  File02.mf4  File03.mf4  File04.mf4  File05.mf4  

Создайте MDF Datastore

Вы создаете MDF datastore путем выбора папки, содержащей набор 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 Datastore

Несколько опции позволяют контролировать, какие данные считываются из MDF-файлов и как выполняются чтения. В этом случае первая группа каналов используется по умолчанию. Обратите внимание, что одновременно datastore может выбрать только одну группу каналов. Можно также задать определенные каналы в выбранной группе каналов для чтения. В этом случае все каналы считываются по умолчанию.

mds.SelectedChannelGroupNumber
mds.SelectedChannelNames
ans =

     1


ans = 

  2×1 string array

    "Sigend_Int16_LE_Offset_32"
    "Unsigend_UInt32_LE_Master_Offset_0"

Предварительный просмотр MDF Datastore

Использование preview вы можете получить быстрое представление данных, доступных в наборе файлов. Preview всегда возвращает до восьми точек данных из первого файла в datastore.

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 Datastore readall

Можно использовать readall функция для чтения всего содержимого данных в одном вызове. Это эффективный способ чтения из многих файлов, когда набор данных помещается в доступную память. После выполнения readall, datastore сбрасывается в начало набора данных.

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 Datastore read

Можно использовать read функция для получения данных из набора файлов. По умолчанию чтения из MDF datastore будут считывать данные всего файла на каждый вызов. Степень datastore исходит от чтения через несколько файлов последовательно в наборе файлов. Когда вы читаете, datastore автоматически переходит от одного файла к следующему, пока не будут считаны все данные из всех файлов.

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 Datastore

В любой момент можно вызвать reset чтобы начать снова в начале набора данных.

reset(mds)

Сконфигурируйте MDF Datastore, считанный записью данных

Можно использовать 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 Datastore, считанный временной меткой данных

Можно также задать ReadSize как длительность для чтения точек данных по истекшему времени. Обратите внимание, что при изменении типа чтения datastore сбрасывается в начало набора данных.

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