Анализируйте данные Используя Datastore MDF и длинные массивы

В этом примере показано, как работать с большим набором данных с помощью длинных массивов и функции datastore MDF. Длинные массивы обычно используются, чтобы выполнить вычисления на различных типах данных, которые не умещаются в памяти.

Этот пример сначала работает с небольшим подмножеством данных и затем масштабирует, чтобы анализировать целый набор данных. Несмотря на то, что набор данных, используемый здесь, не может представлять фактический размер в реальных приложениях, тот же аналитический метод может масштабировать далее, чтобы работать над наборами данных, столь большими, что они не могут быть считаны в память.

Чтобы узнать больше о длинных массивах, смотрите пример Анализ больших данных в MATLAB Используя Длинные массивы.

Введение в длинные массивы

Длинные массивы и длинные таблицы используются, чтобы работать с данными, которые не помещаются в память, который имеет любое количество строк. Используя длинные массивы и таблицы, можно работать с большими наборами данных способом, похожим на массивы MATLAB в оперативной памяти.

Различие - то, что длинные массивы обычно остаются неоцененными, пока вычисления не требуют быть выполненными. Эта отсроченная оценка позволяет MATLAB объединить вычисления в очереди, где возможный и берут минимальное количество проходов через данные.

Создайте Datastore MDF

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

Создайте datastore MDF с помощью mdfDatastore функция путем выбора MDF-file EngineData_MDF_TallArray.mf4 в текущей директории рабочего процесса. Этот файл содержит данные, к которым добавляют метку времени, регистрируемые из модели Simulink, представляющей завод по производству двигателей и контроллер, подключенный к динамометру.

mds = mdfDatastore("EngineData_MDF_TallArray.mf4")
mds = 
  MDFDatastore with properties:

  DataStore Details
                         Files: {
                                ' ...\Documents\MATLAB\Examples\vnt-ex08773747\EngineData_MDF_TallArray.mf4'
                                }
                 ChannelGroups: 
                                  ChannelGroupNumber    AcquisitionName     Comment          ... and 4 more columns    
                                  __________________    _______________    __________                

                                          1               {1×1 cell}       {1×1 cell}                


                      Channels: 
                                  ChannelGroupNumber       ChannelName       DisplayName        ... and 10 more columns    
                                  __________________    _________________    ___________                

                                          1             {'EngineSpeed'  }        ''                      
                                          1             {'TorqueCommand'}        ''                      
                                          1             {'EngineTorque' }        ''                      

                                ... and 1 more rows

  Options
          SelectedChannelNames: {
                                'EngineSpeed';
                                'TorqueCommand';
                                'EngineTorque'
                                 ... and 1 more
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 'file'
                    Conversion: Numeric

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

mds.SelectedChannelGroupNumber
ans = 1
mds.SelectedChannelNames
ans = 4×1 string
    "EngineSpeed"
    "TorqueCommand"
    "EngineTorque"
    "t"

Сконфигурируйте datastore MDF, чтобы выбрать только три переменные интереса: EngineSpeed, TorqueCommand, и EngineTorque.

mds.SelectedChannelNames = ["EngineSpeed", "TorqueCommand", "EngineTorque"]
mds = 
  MDFDatastore with properties:

  DataStore Details
                         Files: {
                                ' ...\Documents\MATLAB\Examples\vnt-ex08773747\EngineData_MDF_TallArray.mf4'
                                }
                 ChannelGroups: 
                                  ChannelGroupNumber    AcquisitionName     Comment          ... and 4 more columns    
                                  __________________    _______________    __________                

                                          1               {1×1 cell}       {1×1 cell}                


                      Channels: 
                                  ChannelGroupNumber       ChannelName       DisplayName        ... and 10 more columns    
                                  __________________    _________________    ___________                

                                          1             {'EngineSpeed'  }        ''                      
                                          1             {'TorqueCommand'}        ''                      
                                          1             {'EngineTorque' }        ''                      

                                ... and 1 more rows

  Options
          SelectedChannelNames: {
                                'EngineSpeed';
                                'TorqueCommand';
                                'EngineTorque'
                                }
    SelectedChannelGroupNumber: 1
                      ReadSize: 'file'
                    Conversion: Numeric

Предварительно просмотрите выбранные данные с помощью preview функция.

preview(mds)
ans=8×3 timetable
         Time         EngineSpeed    TorqueCommand    EngineTorque
    ______________    ___________    _____________    ____________

    0 sec                     0              0           47.153   
    0 sec              2.37e-26              0           47.153   
    1.47e-05 sec        0.11056         47.158           47.158   
    8.85e-05 sec        0.66312         48.708           48.708   
    0.00010107 sec      0.75762          49.77            49.77   
    0.00010107 sec      0.75762          49.77            49.77   
    0.0001405 sec         1.053         39.967           39.967   
    0.00017993 sec       1.3482         23.143           23.143   

Создание tall array

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

tt = tall(mds)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

tt =

  M×3 tall timetable

         Time         EngineSpeed    TorqueCommand    EngineTorque
    ______________    ___________    _____________    ____________

    0 sec                     0              0           47.153   
    0 sec              2.37e-26              0           47.153   
    1.47e-05 sec        0.11056         47.158           47.158   
    8.85e-05 sec        0.66312         48.708           48.708   
    0.00010107 sec      0.75762          49.77            49.77   
    0.00010107 sec      0.75762          49.77            49.77   
    0.0001405 sec         1.053         39.967           39.967   
    0.00017993 sec       1.3482         23.143           23.143   
          :                :               :               :
          :                :               :               :

Отображение включает первые несколько строк данных. Размер расписания может отобразиться как M×3 указать, что количество строк еще не известно MATLAB.

Выполните вычисления на длинном массиве

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

Распространено работать с неоцененными длинными массивами, и запрос вывел только при необходимости. MATLAB не знает содержимое или размер неоцененного длинного массива, пока вы не запрашиваете, чтобы это было оценено и отображено.

Вычислите медиану, минимум и максимальные значения TorqueCommand переменная. Обратите внимание на то, что результаты сразу не оценены.

medianTorqueCommand = median(tt.TorqueCommand)
medianTorqueCommand =

  tall double

    ?

Preview deferred. Learn more.
minTorqueCommand = min(tt.TorqueCommand)
minTorqueCommand =

  tall double

    ?

Preview deferred. Learn more.
maxTorqueCommand = max(tt.TorqueCommand)
maxTorqueCommand =

  tall double

    ?

Preview deferred. Learn more.

Сбор результатов в рабочую область

gather функционируйте оценка сил всех операций в очереди, и загружает получившийся выход в память назад.

Выполните операции в очереди, medianminMax , и оцените ответы. Если вычисление требует нескольких проходов через данные, MATLAB определяет минимальное количество передач, чтобы сохранить время выполнения и отображает эту информацию в командной строке.

[medianTorqueCommand, minTorqueCommand, maxTorqueCommand] = gather(medianTorqueCommand, minTorqueCommand, maxTorqueCommand)
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 4: Completed in 6.7 sec
- Pass 2 of 4: Completed in 0.73 sec
- Pass 3 of 4: Completed in 1.3 sec
- Pass 4 of 4: Completed in 0.62 sec
Evaluation completed in 12 sec
medianTorqueCommand = 116.2799
minTorqueCommand = 0
maxTorqueCommand = 232.9807

Выбор Subset of Tall Array

Используйте head выбрать подмножество 10 000 строк из данных для прототипирования кода прежде, чем масштабироваться к полному набору данных.

ttSubset = head(tt, 10000)
ttSubset =

  10,000×3 tall timetable

         Time         EngineSpeed    TorqueCommand    EngineTorque
    ______________    ___________    _____________    ____________

    0 sec                     0              0           47.153   
    0 sec              2.37e-26              0           47.153   
    1.47e-05 sec        0.11056         47.158           47.158   
    8.85e-05 sec        0.66312         48.708           48.708   
    0.00010107 sec      0.75762          49.77            49.77   
    0.00010107 sec      0.75762          49.77            49.77   
    0.0001405 sec         1.053         39.967           39.967   
    0.00017993 sec       1.3482         23.143           23.143   
          :                :               :               :
          :                :               :               :

Удалите дублирующиеся строки в длинном массиве

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

ttSubset = unique(ttSubset)
ttSubset =

  9,968×3 tall timetable

         Time         EngineSpeed    TorqueCommand    EngineTorque
    ______________    ___________    _____________    ____________

    0 sec                     0              0            47.153  
    0 sec              2.37e-26              0            47.153  
    1.47e-05 sec        0.11056         47.158            47.158  
    8.85e-05 sec        0.66312         48.708            48.708  
    0.00010107 sec      0.75762          49.77             49.77  
    0.0001405 sec         1.053         39.967            39.967  
    0.00017993 sec       1.3482         23.143            23.143  
    0.00037708 sec       2.8228         23.143         -0.021071  
          :                :               :               :
          :                :               :               :

Вычислите мощность двигателя

Вычислите мощность двигателя в киловаттах (кВт) с EngineSpeed и EngineTorque использование формулы P[kW]=πN[rpm]T[Nm]301000. Сохраните результаты в новую переменную под названием EnginePower в длинном расписании.

ttSubset.EnginePower = (pi * ttSubset.EngineSpeed .* ttSubset.EngineTorque) / (30 * 1000)
ttSubset =

  9,968×4 tall timetable

         Time         EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    ______________    ___________    _____________    ____________    ___________

    0 sec                     0              0            47.153                0
    0 sec              2.37e-26              0            47.153       1.1703e-28
    1.47e-05 sec        0.11056         47.158            47.158       0.00054599
    8.85e-05 sec        0.66312         48.708            48.708        0.0033824
    0.00010107 sec      0.75762          49.77             49.77        0.0039487
    0.0001405 sec         1.053         39.967            39.967        0.0044072
    0.00017993 sec       1.3482         23.143            23.143        0.0032675
    0.00037708 sec       2.8228         23.143         -0.021071      -6.2287e-06
          :                :               :               :               :
          :                :               :               :               :

topkrows функция для длинных массивов возвращает главный k строки в отсортированном порядке. Получите лучшие 20 строк с максимальным EnginePower значения.

maxEnginePower = topkrows(ttSubset, 20, "EnginePower")
maxEnginePower =

  20×4 tall timetable

      Time       EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    _________    ___________    _____________    ____________    ___________

    15.17 sec        750           78.052           78.052         6.1302   
    15.16 sec        750           77.841           77.841         6.1136   
    15.15 sec        750           77.556           77.556         6.0912   
    15.14 sec        750           77.326           77.326         6.0732   
    15.18 sec        750           77.277           77.277         6.0693   
    15.13 sec        750           77.157           77.157         6.0599   
    15.12 sec        750           77.082           77.082          6.054   
    15.11 sec        750           77.067           77.075         6.0534   
        :             :               :               :               :
        :             :               :               :               :

Вызовите gather функция, чтобы выполнить все операции в очереди и собрать результаты в память.

[ttSubset, maxEnginePower] = gather(ttSubset, maxEnginePower)
ttSubset=9968×4 timetable
         Time         EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    ______________    ___________    _____________    ____________    ___________

    0 sec                     0              0            47.153                0
    0 sec              2.37e-26              0            47.153       1.1703e-28
    1.47e-05 sec        0.11056         47.158            47.158       0.00054599
    8.85e-05 sec        0.66312         48.708            48.708        0.0033824
    0.00010107 sec      0.75762          49.77             49.77        0.0039487
    0.0001405 sec         1.053         39.967            39.967        0.0044072
    0.00017993 sec       1.3482         23.143            23.143        0.0032675
    0.00037708 sec       2.8228         23.143         -0.021071      -6.2287e-06
    0.00076951 sec       5.7492             15         -0.042938      -2.5851e-05
    0.0014014 sec        10.437             15         -0.078013      -8.5265e-05
    0.0023449 sec        17.382             15          -0.13009      -0.00023679
    0.0036773 sec        27.079             15          -0.20304      -0.00057575
    0.0054808 sec            40             15          -0.30067       -0.0012595
    0.0072843 sec        52.691             15          -0.39703       -0.0021907
    0.01 sec             71.373             15          -0.53973       -0.0040341
    0.013562 sec         95.119             15            51.176          0.50976
      ⋮

maxEnginePower=20×4 timetable
      Time       EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    _________    ___________    _____________    ____________    ___________

    15.17 sec        750           78.052           78.052         6.1302   
    15.16 sec        750           77.841           77.841         6.1136   
    15.15 sec        750           77.556           77.556         6.0912   
    15.14 sec        750           77.326           77.326         6.0732   
    15.18 sec        750           77.277           77.277         6.0693   
    15.13 sec        750           77.157           77.157         6.0599   
    15.12 sec        750           77.082           77.082          6.054   
    15.11 sec        750           77.067           77.075         6.0534   
    15.1 sec         750           77.067           77.067         6.0528   
    15.09 sec        750           77.059           77.059         6.0522   
    15.08 sec        750           77.051           77.051         6.0516   
    15.07 sec        750           77.042           77.042         6.0509   
    15.06 sec        750           77.034           77.034         6.0502   
    15.05 sec        750           77.025           77.025         6.0495   
    15.04 sec        750           77.016           77.016         6.0488   
    15.03 sec        750           77.006           77.006         6.0481   
      ⋮

Визуализируйте данные в длинном массиве

Визуализируйте EngineTorque и EnginePower сигналы в зависимости от времени в графике с двумя осями Y.

figure
yyaxis left
plot(ttSubset.Time, ttSubset.EngineTorque)
title("Engine Torque and Engine Power Over Time")
xlabel("Time")
ylabel("Engine Torque [Nm]")

yyaxis right
plot(ttSubset.Time, ttSubset.EnginePower)
ylabel("Engine Power [kW]")

Масштабирование к целому набору данных

Вместо того, чтобы использовать меньшие данные, возвращенные в head, масштабируйте, чтобы применить те же шаги на целый набор данных при помощи полного длинного расписания.

tt = tall(mds)
tt =

  M×3 tall timetable

         Time         EngineSpeed    TorqueCommand    EngineTorque
    ______________    ___________    _____________    ____________

    0 sec                     0              0           47.153   
    0 sec              2.37e-26              0           47.153   
    1.47e-05 sec        0.11056         47.158           47.158   
    8.85e-05 sec        0.66312         48.708           48.708   
    0.00010107 sec      0.75762          49.77            49.77   
    0.00010107 sec      0.75762          49.77            49.77   
    0.0001405 sec         1.053         39.967           39.967   
    0.00017993 sec       1.3482         23.143           23.143   
          :                :               :               :
          :                :               :               :

Во-первых, удалите дублирующиеся строки из длинного расписания.

tt = unique(tt)
tt =

  M×3 tall timetable

    Time    EngineSpeed    TorqueCommand    EngineTorque
    ____    ___________    _____________    ____________

     ?           ?               ?               ?      
     ?           ?               ?               ?      
     ?           ?               ?               ?      
     :           :               :               :
     :           :               :               :

Preview deferred. Learn more.

Во-вторых, вычислите мощность двигателя и получите лучшие 20 строк с максимальным EnginePower значения.

tt.EnginePower = (pi * tt.EngineSpeed .* tt.EngineTorque) / (30 * 1000)
tt =

  M×4 tall timetable

    Time    EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    ____    ___________    _____________    ____________    ___________

     ?           ?               ?               ?               ?     
     ?           ?               ?               ?               ?     
     ?           ?               ?               ?               ?     
     :           :               :               :               :
     :           :               :               :               :

Preview deferred. Learn more.
maxEnginePower = topkrows(tt, 20, "EnginePower")
maxEnginePower =

  M×4 tall timetable

    Time    EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    ____    ___________    _____________    ____________    ___________

     ?           ?               ?               ?               ?     
     ?           ?               ?               ?               ?     
     ?           ?               ?               ?               ?     
     :           :               :               :               :
     :           :               :               :               :

Preview deferred. Learn more.
[tt, maxEnginePower] = gather(tt, maxEnginePower)
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: 0% complete
Evaluation 0% complete

- Pass 1 of 1: Completed in 1.3 sec
Evaluation completed in 1.9 sec
tt=359326×4 timetable
         Time         EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    ______________    ___________    _____________    ____________    ___________

    0 sec                     0              0            47.153                0
    0 sec              2.37e-26              0            47.153       1.1703e-28
    1.47e-05 sec        0.11056         47.158            47.158       0.00054599
    8.85e-05 sec        0.66312         48.708            48.708        0.0033824
    0.00010107 sec      0.75762          49.77             49.77        0.0039487
    0.0001405 sec         1.053         39.967            39.967        0.0044072
    0.00017993 sec       1.3482         23.143            23.143        0.0032675
    0.00037708 sec       2.8228         23.143         -0.021071      -6.2287e-06
    0.00076951 sec       5.7492             15         -0.042938      -2.5851e-05
    0.0014014 sec        10.437             15         -0.078013      -8.5265e-05
    0.0023449 sec        17.382             15          -0.13009      -0.00023679
    0.0036773 sec        27.079             15          -0.20304      -0.00057575
    0.0054808 sec            40             15          -0.30067       -0.0012595
    0.0072843 sec        52.691             15          -0.39703       -0.0021907
    0.01 sec             71.373             15          -0.53973       -0.0040341
    0.013562 sec         95.119             15            51.176          0.50976
      ⋮

maxEnginePower=20×4 timetable
       Time       EngineSpeed    TorqueCommand    EngineTorque    EnginePower
    __________    ___________    _____________    ____________    ___________

    3819.8 sec       5000           217.53           217.53          113.9   
    3819.8 sec       5000           217.53           217.53          113.9   
    3819.8 sec       5000           217.53           217.53          113.9   
    3819.8 sec       5000           217.53           217.53          113.9   
    3819.8 sec       5000           217.53           217.53          113.9   
    3819.9 sec       5000           217.53           217.53          113.9   
    3819.9 sec       5000           217.53           217.53          113.9   
    3819.9 sec       5000           217.53           217.53          113.9   
    3819.9 sec       5000           217.52           217.52         113.89   
    3819.9 sec       5000           217.52           217.52         113.89   
    3820 sec         5000           217.52           217.52         113.89   
    3820.1 sec       5000           217.52           217.52         113.89   
    3820.2 sec       5000           217.52           217.52         113.89   
    3820.3 sec       5000           217.52           217.52         113.89   
    3820.4 sec       5000           217.52           217.52         113.89   
    3820.5 sec       5000           217.52           217.52         113.89   
      ⋮

Наконец, визуализируйте EngineTorque и EnginePower сигналы в зависимости от времени в графике с двумя осями Y.

figure
yyaxis left
plot(tt.Time, tt.EngineTorque)
title("Engine Torque and Engine Power Over Time")
xlabel("Time")
ylabel("Engine Torque [Nm]")

yyaxis right
plot(tt.Time, tt.EnginePower)
ylabel("Engine Power [kW]")

Закройте MDF-файл

Закройте доступ к MDF-файлу путем очищения переменной datastore MDF из рабочей области.

clear mds