数据压缩
有关内存中和持久数据库压缩的优势讨论,请参阅“数据压缩”页面。
内存数据库压缩
通过在传递给 mco_db_open_dev()
的 mco_db_params_t.mode_mask
参数中设置 MCO_DB_INMEMORY_COMPRESSION选项,可以启用内存数据库压缩。
请注意,此选项不适用于基于磁盘的或“直接指针”数据库。
有三个控制压缩的参数,它们也在 mco_db_params_t 结构中进行设置:
- compression_level:压缩级别,0 到 9 的整数值。数值越高,压缩效果越好,但速度越慢。
- 对于默认的 LZ 算法,目前仅使用 0 和 1 这两个值。
- zlib 实现接受 0 到 9 的值:0 表示不压缩,不同大小的对象按其实际大小截断;1(默认值)表示标准压缩级别。
- compression_mask:压缩掩码,要压缩的页面类型的位图。默认情况下,仅压缩对象的头页面。
- expected_compression_ratio:预期压缩比(默认值为 10),用于分配页面映射。虚拟数据库空间不能大于物理大小 * 压缩比。页面映射中的每个元素大小为 8 字节,因此压缩需要额外的内存,大小为
mem_size/page_size*expected_compression_ratio*8
用于虚拟到物理页面映射。另外还需要mem_size/page_size*4
字节用于物理到虚拟页面映射。
内存中的压缩和加密使用相同的页面哈希表,其参数由 mco_db_params_t
中 max_active_pages
和 page_hash_bundles
控制。压缩机为解压缩访问的页面分配大小为 max_active_pages * page_hash_bundles * db_max_connection * mem_page_size
的缓冲区。
请注意
内存压缩仅可用于纯内存数据库。因此,如果在使用 mcovtdsk
库时指定了此模式,函数 mco_db_open_dev()
或 mco_db_load()
将返回错误代码 MCO_E_ILLEGAL_PARAM
。
持久数据库压缩
要启用压缩,请在文件设备规范的 dev.file.flags
字段中设置 MCO_FILE_OPEN_COMPRESSED 标志。例如:
dev[2].type = MCO_MEMORY_FILE;
dev[2].assignment = MCO_MEMORY_ASSIGN_PERSISTENT;
sprintf( dev[2].dev.file.name, FILE_PREFIX "%s.dbs", dbName );
dev[2].dev.file.flags = MCO_FILE_OPEN_COMPRESSED;
如果未设置此标志,则不会执行压缩,文件将作为普通文件运行。同时,可以对某些数据库/文件使用压缩,而对其他文件不使用压缩。
另外,还可以使用 mco_db_open_dev()
的 mco_db_params_t 结构中的 compression_level
和 disk_max_database_size
元素来修改压缩过程。
disk_max_database_size :值决定内存分配位图的大小。如果未设置,默认为 0 或 INFINITE_DATABASE_SIZE),则文件大小限制为 1Tb(这需要一个 2Gb 的位图)。
compression_level :一个 0 到 9 之间的整数值,用于指定压缩级别。值为 0 时禁用压缩。值为 1 及以上时指定不同的压缩策略,具体如下:
1(默认策略);意味着基于以下标准进行条件压缩:
- 要求压缩率为 25%,否则不值得压缩。
- 如果前 1Kb 没有压缩则停止。
- 如果找到 128 字节的匹配则停止历史查找。
- 每次迭代时将“良好匹配”大小降低 10%。
2 - 9:对应于越来越复杂的无条件压缩(始终压缩)策略,这些策略具有以下标准:
即使压缩率较低也要继续。
如果找到 128 字节的匹配项则停止历史记录查找。
随着压缩级别数字的增加,尝试更多次以找到更好的匹配项。
SmartEDB在两个特殊的文件系统库中实现了LZ压缩:mcofu98zip和mcofu98ziplog。这两个库仅适用于Linux、MacOS和Solaris等Unix系统。开发人员可以通过简单地链接这些文件系统库中的一个来代替标准文件系统库(如mcofuni
或mcofu98
),从而选择所需的压缩实现。
mcofu98zip库主要用于随机访问I/O操作的压缩,因此它只用于压缩数据库文件(而不是事务日志文件)。它会压缩主数据库文件(
dbname.dbs
),并创建两个额外的文件:- 页面映射文件(
dbname.pagemap
)用于间接访问页面; - 内存分配位图文件(
dbname.bitmap
)用于管理文件中的空间。
由于更新页的大小可能会变化,需要重新分配这些页,因此这两个辅助文件是必需的。
- 页面映射文件(
mcofu98ziplog库则专门用于压缩事务日志文件。它使用与mcofu98zip相同的压缩算法,但只覆盖顺序I/O方法。因为压缩是按顺序进行的,且页面不会被覆盖,所以不需要额外的页面映射和分配映射文件。因此,使用mcofu98ziplog时只会生成一个压缩的日志文件,而不会产生其他附加文件。
请注意
单个应用程序中无法同时对数据库文件和事务日志文件进行压缩,因为只能将一种压缩实现(mcofu98zip 或 mcofu98ziplog)链接到应用程序中。
另外,压缩功能实现了自身的 CRC 校验,因此不能与 CRC 校验同时启用。
物联网通信中的数据压缩
要启用物联网通信的数据压缩,您可以通过设置结构mco_iot_comm_paramst_t 中的compression_level
元素来实现。默认情况下,compression_level = 0
,表示不进行压缩。
根据数据压缩页面的说明,只有当服务器和设备双方的compression_level
都大于0时,它们之间的通信才会被压缩,并且所有参与通信的组件必须使用相同的压缩级别值。
此外,数据压缩页面还详细介绍了用于计算压缩比的公式。您可以调用mco_iot_conn_get_stat()
API来获取连接的统计信息。返回的结构mco_iot_connection_stat_t中包含sent_compression_ratio
和recv_compression_ratio
两个元素,分别显示了传出和传入通信的压缩效率。