经过七个月的开发,该框架的 0.2.0 版本发布了。 打开ZL旨在创建无损数据压缩器。
该框架包含一个基础库和用于创建以该语言描述的专用压缩器的工具。 SDDL.
打造一台优秀的专用压缩机需要两个步骤:
- 数据分析以提取结构。
- 使用能够利用压缩后结构实现良好压缩效果的后端压缩器。
OpenZL 为这两个阶段都提供了工具。
该项目使用 C 和 C++ 编写,并以 BSD 许可证发布。
主要变化
SDDL2
SDDL 完全从底层重写,以实现其最初的设计目标。虽然最初的演示版本只是一个简化的运行时环境,但 SDDL2 却是一个功能齐全的编译器:解析器将数据传递给语义分析器,语义分析器再将类型化的抽象语法树 (AST) 传递给优化器,优化器控制代码生成器,最终生成虚拟机字节码。
关键成果是即时解析。当仅使用参数和常量即可完全确定记录的位置时,引擎会直接跳转到任何字段,无需扫描前面的字节,从而实现无拷贝访问和数GB/s的吞吐量。
该语言本身也随着其工具集的发展而不断演进。它现在支持条件语句中的 when 子句、参数化记录和匿名记录、对记录字段成员的访问以及位运算符和逻辑运算符。
在开发者方面,语义分析步骤现在可以在编译时(并指定源代码位置)而不是在运行时识别未定义的引用、类型不匹配和参数数量错误,并且已经发布了用于 .sddl 文件语法高亮显示的 VS Code 扩展。
新增内置LZ编解码器
OpenZL 现在包含了自己的 LZ 编解码器(表示为 ZL_GRAPH_LZ),并在 zli 工具中提供了一个顺序压缩配置文件。该编解码器的开发工作仍在进行中,旨在扩展其功能集并提高处理小输入数据时的性能。目前,它支持的功能相当于 zstd 1 级,压缩窗口为 64 KB。
OpenZL 允许对 LZ 流水线的每个阶段进行重新设计以提升速度。其图架构还允许组合熵编码阶段,而不是使用适用于所有用例的单一流水线。多个阶段可以合并为一个操作,从而提高处理速度。这使得 OpenZL 在 Silesia 语料库上实现了比 Zstandard 1 级快 10% 的压缩速度和快 70% 的解压缩速度。 我们的测试:
| 压缩器 | 压缩率 | 压缩速度 | 解压速度 |
|---|---|---|---|
| OpenZL LZ 1 级 | 2.74 | 466 MB / s的 | 2288 MB / s的 |
| Zstd 级别 1,窗口大小为 64K | 2.74 | 419 MB / s的 | 1254 MB / s的 |
| Zstd 水平 1 | 2.89 | 424 MB / s的 | 1345 MB / s的 |
支持超大型输入数据
zli 现在支持处理海量输入数据(数 GB)。压缩前,此类数据会自动分割成大小适中的块(默认约为 16 MB),从而限制内存使用、提高数据局部性并支持并行处理。SDDL2 在处理模式时也实现了类似的自动分块功能。在此过程中,我们创建或更新了新的分段器(适用于 CSV、Parquet 和标准数值数据),并且所有分段器现在都支持序列化和配置,因此可以将选定的布局保存在压缩器中以便后续重用。
这一过程在压缩过程中透明地进行。请注意,训练流程有所不同,且不受影响,因此它并非设计用于接收海量输入数据作为训练素材。
在线图形可视化工具的改进(试试)
可视化工具现在可以识别从开始到结束的压缩和解压缩过程。
流预览面板可让您看到实际沿着每个边缘流动的字节,而修剪控件可使即使是大型流也易于处理。
设置面板将所有显示选项集中在一个地方,并且提供了一整套快捷键——方向导航、有序遍历、展开和折叠以及节点选择——让您无需鼠标即可方便地使用该工具。
现在跟踪信息已进行版本控制,基于块的压缩显示正确,zli 终于可以使用新的 --trace 和 --trace-streams-dir 标志生成自己的跟踪信息。
杂项
- 目录中新增了多个编解码器。Partition 和 bitpack 编解码器现在使用统一的解码器。浮点位分割编解码器现在包含专用的编码器和解码器,分别支持 fp16、fp32、fp64 和 bf16 格式,并具有专门的加速功能。此外,还新增了范围感知分割(split_byrange)、长度复用器、哨兵编解码器、lz4 图以及一些辅助函数,例如 tryParseInt 和 splitByParam。
- API已得到简化。
- 改进的模糊测试。
- 改进了构建和打包流程,以支持更多平台。
来源: linux.org.ru
