将压缩数据写入 MDF 文件
此示例说明如何使用压缩将数据写入 MDF 文件,从而提高存储效率。
此示例中使用的 MAT 文件 MDFTimetables.mat 包含两个时间表。
时间表
TT1具有数值数据类型的变量,包括 uint8、uint16、uint32、uint64、int8、int16、int32、int64、single 和 double。时间表
TT2具有字符串和字节数组数据类型的变量,包括固定长度和可变长度数据。
简介
根据 ASAM MDF 标准,在 MDF 版本 4.1 中引入的数据压缩块 (DZBLOCK) 允许对 MDF 文件中的各种数据块进行压缩,这在磁盘空间有限时特别有用。它可以在写入过程中压缩信号数据,从而有效减小文件大小。但是,对于非常小的数据段,压缩开销未必能抵消大小优势。读取工具可以解压缩数据以访问原始数据。
ASAM MDF V4.2.0 支持以下 DZBLOCK 压缩算法:
dz_zip_type = 0:紧缩
dz_zip_type = 1:转置 + 紧缩
mdfWrite 函数默认不使用压缩写入。要使用压缩写入,必须将 CompressionType 名称-值参量设置为 "none" 以外的值。
mdfWrite 的 CompressionType 名称-值参量控制在将数据写入 MDF 文件时使用的压缩算法:
"
none"(默认值):写入未压缩的数据。"
deflate":使用紧缩算法写入压缩数据。"
transposeDeflate":使用转置-紧缩算法写入压缩数据。
CompressionLevel 名称-值参量接受数值,并根据 CompressionType 控制压缩级别:
对于 "
none":默认且唯一可接受的值是 0。对于 "
deflate" 和 "transposeDeflate":默认值为 6,可接受的值范围从 0(无压缩)到 9(最大压缩)。压缩级别越高,写入时间越长。
将时间表加载到工作区
将时间表变量 TT1 和 TT2,从 MDFTimetables.mat 加载到工作区。
load("MDFTimetables.mat")将压缩数据直接写入新 MDF 文件
使用 mdfWrite 函数,将目标 MDF 文件名、时间表变量 TT1 和 "deflate" 压缩类型指定为输入参量。由于未指定 CompressionLevel 名称-值参量,因此将使用指定压缩类型的默认压缩级别,在此示例中,"deflate" 的默认级别为 6。TT1 中的数据写入文件的第一个可用通道组索引,该索引为通道组 1,因为 CompressedSignalData.mf4 是一个新创建的文件。
mdfWrite("CompressedSignalData.mf4", TT1, CompressionType="deflate")
Warning: Specified target file did not exist. Created file: C:\ExampleManager9a362a\user.Bdoc.Compression_Example\vnt-ex52002539\CompressedSignalData.mf4
使用压缩写入数据是基于通道组的,这意味着可以为写入每个通道组使用不同压缩类型。再次调用 mdfWrite 以将 TT2 写入下一个可用的通道组索引 2,这次使用压缩类型 "transposeDeflate" 和压缩级别 9(最大压缩,最慢速度)进行写入。
mdfWrite("CompressedSignalData.mf4", TT2, CompressionType="transposeDeflate", CompressionLevel=9)
检查数据
要验证数据是否已成功写入文件,请使用 mdfRead 从两个通道组读取数据并检查结果。
data = mdfRead("CompressedSignalData.mf4")data=2×1 cell array
100×10 timetable
10×4 timetable
chanGrp1Data = data{1}chanGrp1Data=100×10 timetable
0 sec 0 200 600 1400 -99 -198 -396 -794 -9.8000 -19.6000
0.1 sec 2 204 608 1416 -97 -194 -388 -778 -9.6000 -19.2000
0.2 sec 4 208 616 1432 -95 -190 -380 -762 -9.4000 -18.8000
0.3 sec 6 212 624 1448 -93 -186 -372 -746 -9.2000 -18.4000
0.4 sec 8 216 632 1464 -91 -182 -364 -730 -9 -18
0.5 sec 10 220 640 1480 -89 -178 -356 -714 -8.8000 -17.6000
0.6 sec 12 224 648 1496 -87 -174 -348 -698 -8.6000 -17.2000
0.7 sec 14 228 656 1512 -85 -170 -340 -682 -8.4000 -16.8000
0.8 sec 16 232 664 1528 -83 -166 -332 -666 -8.2000 -16.4000
0.9 sec 18 236 672 1544 -81 -162 -324 -650 -8 -16
1 sec 20 240 680 1560 -79 -158 -316 -634 -7.8000 -15.6000
1.1 sec 22 244 688 1576 -77 -154 -308 -618 -7.6000 -15.2000
1.2 sec 24 248 696 1592 -75 -150 -300 -602 -7.4000 -14.8000
1.3 sec 26 252 704 1608 -73 -146 -292 -586 -7.2000 -14.4000
⋮
chanGrp2Data = data{2}chanGrp2Data=10×4 timetable
0 sec "abcd" [255,255,255,255,255] "zero" [255,255]
1 sec "efgh" [18,35,52,69,86] "one" [18,35,52,69,86]
2 sec "ijkl" [0,1,2,3,4] "two" [0,1,2,3,4,5,6,7]
3 sec "mnop" [4,3,2,1,0] "three" [4,3,2,1,0]
4 sec "qrst" [255,254,253,252,251] "four" [253,252,251]
5 sec "uvwx" [250,249,248,247,246] "five" [250,249,248,247,246]
6 sec "yzAB" [245,244,243,242,241] "six" [245,244,243,242,241]
7 sec "CDEF" [240,239,238,237,236] "seven" [240,238,236]
8 sec "GHIJ" [235,234,233,232,231] "eight" [235,233,231]
9 sec "KLMN" [255,255,255,255,255] "nine" [255,255,255,255,255]
将文件大小与包含未压缩信号数据的 MDF 文件进行比较
使用 mdfWrite 函数将 TT1 和 TT2 无压缩地写入名为 UncompressedSignalData.mf4 的新 MDF 文件。
mdfWrite("UncompressedSignalData.mf4", TT1)Warning: Specified target file did not exist. Created file: C:\ExampleManager9a362a\user.Bdoc.Compression_Example\vnt-ex52002539\UncompressedSignalData.mf4
mdfWrite("UncompressedSignalData.mf4", TT2)使用 dir 函数获取两个 MDF 文件的文件大小(以字节为单位)并进行比较。
compressedFileSizeBytes = dir("CompressedSignalData.mf4").bytescompressedFileSizeBytes = 11864
uncompressedFileSizeBytes = dir("UncompressedSignalData.mf4").bytesuncompressedFileSizeBytes = 14640
reductionPercentage = ((uncompressedFileSizeBytes - compressedFileSizeBytes) / uncompressedFileSizeBytes) * 100;
fprintf("%.2f%% reduction in MDF file size when writing signal data with compression.\n", reductionPercentage)18.96% reduction in MDF file size when writing signal data with compression.