В этом примере показано, как использовать функцию MDF Datastore Vehicle Network Toolbox для быстрой и эффективной обработки набора данных, распределенного по набору нескольких MDF-файлов. Этот рабочий процесс также ценен, когда слишком много данных, чтобы помещаться в доступную память.
Найдите набор MDF-файлов, представляющих записанную информацию из нескольких тестовых последовательностей. Обратите внимание, что MDF-файлы, которые будут использоваться MDF datastore в качестве набора, должны иметь одну и ту же структуру содержимого группы каналов и канала.
dir('File*.mf4')
File01.mf4 File02.mf4 File03.mf4 File04.mf4 File05.mf4
Вы создаете 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 может выбрать только одну группу каналов. Можно также задать определенные каналы в выбранной группе каналов для чтения. В этом случае все каналы считываются по умолчанию.
mds.SelectedChannelGroupNumber mds.SelectedChannelNames
ans =
1
ans =
2×1 string array
"Sigend_Int16_LE_Offset_32"
"Unsigend_UInt32_LE_Master_Offset_0"
Использование 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
Можно использовать 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
Можно использовать 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
В любой момент можно вызвать reset чтобы начать снова в начале набора данных.
reset(mds)
Можно использовать 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
Можно также задать 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