В этом примере показано, как работать с большим набором данных с помощью длинных массивов и функции datastore MDF. Длинные массивы обычно используются, чтобы выполнить вычисления на различных типах данных, которые не умещаются в памяти.
Этот пример сначала работает с небольшим подмножеством данных и затем масштабирует, чтобы анализировать целый набор данных. Несмотря на то, что набор данных, используемый здесь, не может представлять фактический размер в реальных приложениях, тот же аналитический метод может масштабировать далее, чтобы работать над наборами данных, столь большими, что они не могут быть считаны в память.
Чтобы узнать больше о длинных массивах, смотрите пример Анализ больших данных в MATLAB Используя Длинные массивы.
Длинные массивы и длинные таблицы используются, чтобы работать с данными, которые не помещаются в память, который имеет любое количество строк. Используя длинные массивы и таблицы, можно работать с большими наборами данных способом, похожим на массивы MATLAB в оперативной памяти.
Различие - то, что длинные массивы обычно остаются неоцененными, пока вычисления не требуют быть выполненными. Эта отсроченная оценка позволяет MATLAB объединить вычисления в очереди, где возможный и берут минимальное количество проходов через данные.
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
Длинные массивы похожи на массивы 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
функционируйте оценка сил всех операций в очереди, и загружает получившийся выход в память назад.
Выполните операции в очереди, median
min
Max
, и оцените ответы. Если вычисление требует нескольких проходов через данные, 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
Используйте 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
использование формулы . Сохраните результаты в новую переменную под названием 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-файлу путем очищения переменной datastore MDF из рабочей области.
clear mds