Этот пример показывает вам, как использовать функцию Datastore MDF Vehicle Network Toolbox к быстро и эффективно обработать распространение набора данных через набор нескольких MDF-файлов. Этот рабочий процесс также ценен, когда существует слишком много данных, чтобы поместиться в доступную память.
Найдите набор MDF-файлов, представляющих регистрируемую информацию от нескольких тестовых последовательностей.
dir('File*.mf4')
File01.mf4 File02.mf4 File03.mf4 File04.mf4 File05.mf4
Вы создаете datastore MDF путем выбора местоположения папки, содержащего набор 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
, можно получить быстрое представление доступных данных в наборе файла. Предварительный просмотр всегда возвращает до восьми точек данных в первый файл в 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
, чтобы получить данные из набора файла. По умолчанию чтения от datastore MDF считают ценность целого файла данных на вызов. Степень 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