В этом примере показано, как использовать функцию 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