主要内容

将压缩数据写入 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" 以外的值。

mdfWriteCompressionType 名称-值参量控制在将数据写入 MDF 文件时使用的压缩算法:

  • "none"(默认值):写入未压缩的数据。

  • "deflate":使用紧缩算法写入压缩数据。

  • "transposeDeflate":使用转置-紧缩算法写入压缩数据。

CompressionLevel 名称-值参量接受数值,并根据 CompressionType 控制压缩级别:

  • 对于 "none":默认且唯一可接受的值是 0。

  • 对于 "deflate" 和 "transposeDeflate":默认值为 6,可接受的值范围从 0(无压缩)到 9(最大压缩)。压缩级别越高,写入时间越长。

将时间表加载到工作区

将时间表变量 TT1TT2,从 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 函数将 TT1TT2 无压缩地写入名为 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").bytes
compressedFileSizeBytes = 
11864
uncompressedFileSizeBytes = dir("UncompressedSignalData.mf4").bytes
uncompressedFileSizeBytes = 
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.

另请参阅

函数