Ref: https://www.ibm.com/developerworks/cn/xml/x-datacompression/node
root --> o12有以下三条路径:web
Figure, Language-Equivalent nodes算法
例如:o3, o4, o8, o12 都是 root‘s staff。apache
Figure, Elimination效果后端
Algorithm:架构
Let L(x) := {w | 存在 a path from the root to x labeled w}app
到x期间线上的权值(Label)。ide
The set L(x) may be infinite when there are cycles工具
有环则可能无限循环。优化
Nodes x, y are language-equivalent (x 恒等于 y) if L(x) = L(y)
俩节点的label集合相同,则language-equivalent。
We construct index I by taking the nodes to be the equivalent classes for 恒等于
根据这些个玩意来构建index(图索引)。
XPath: dept/member/(name | phone)
-> dept/member/name UNION dept/member/phone
-> {o5, o6, o9} UNION {o10}
-> {o5, o6, o9, o10}
但这样一来,失去了一些信息细节。
或者为了提升构建效率,计算效率,增长了space cost(可能大于ori graph),变为简洁的树,没有cycle。以下所示:
Figure, Data Guide
xmill原理解析
Firgure, 根据其是否支持执行查询对 XML 压缩器进行分类
Features:
First specialized compressor for XML data
SAX parser for parsing XML data
Still using gzip as its underlying compressor
Clever grouping of data into containers for compression 同type压缩效率高 --> 见Detail
Compress XML via three basic techniques
Compress the structure separately from the data //data与structure 分开
Group the data values according to their types //data内同type一块儿压缩
Apply semantic (specialized) compressors
Detail:在 XMill 中,源 XML 文档的结构和数据值部分被单独收集和压缩。
(A) 在结构部分,在将编码传递到后端通常文本压缩方案以前,XML的标记和属性以基于词典的方式进行编码。
XMill 的结构编码方案为每一个不一样的元素和属性名称分配一个整数代码,做为进入元素和属性名称词典的密钥。
(B) 在数据部分,数据值根据路径和数据类型被分组为同质和语义相关的容器。
而后,每一个容器经过适用于该容器的数据类型的专用的压缩器进行独立压缩。该分组操做本地化重复,从而提升压缩程度。
在最新版本的 XMill 源分布中,压缩格式的中间二进制能够传递到三种替代后端通用压缩器之一:gzip、bzip2 和 PPM。
下图 说明了 XMill 压缩器的通常架构概述,提供 XML 解析器、结构和数据容器,一个或多个压缩方案,以及被压缩的 XML 文件(包含压缩结构和压缩数据)。
本示例包括:
独立的元素(
customers、customers/customer、
customers/customer/firstName、
customers/customer/lastName、
customers/customer/invoice、
customers/customer/invoice/items
customers/customer/invoice/items/item)以及
属性(
customers/customer/@id
customers/customer/invoice/@total)表。
Figure, 将 XML 文件分裂为结构和数据容器的示例
元素和属性表存储 XML 文档的结构容器。
每一个独特路径(元素或属性)的值存储在单独的表格(容器)中,
所以每一个容器中的值均变为同质,能够更高效地进行压缩。具体以下:
同质压缩效果演示
XML-ized apache web log inflates to 24.2 MB (gzipped 2.1MB)
可是,还能更小! 以下:
没有最小,只有更小:
Group the data values according to their types:
Apply semantic (specialized) compressors:
Examples:
15.9M --> 0.82M且有结果的形式。
(非重点)
此类压缩器在编码和解码流程中要求可用 XML 文档的模式信息。例如,XAUST XML 压缩器将 DTD 的模式信息转换成一组肯定性有限自动机 (DFA),每一个 DFA 对应于 DTD 中的一个元素。而后每一个转换都用一个元素标记,与转换有关的行为是调用 DFA 的模拟器,可将该行为用于标记该转换的元素。XAUST 将同一元素的全部数据都纳入单一容器,而后使用算 order-4 压缩器的单个模型以递增方式压缩该容器。使用 DTD 模式信息,XAUST 可以跟踪文档的结构,并可以准确预测预期符号。只要预测到符号是独特的,就不须要对其进行编码,由于解码器从 DTD 生成相同的模型,从而能够生成独特的预期符号。
RNGzip XML 工具能够压缩符合给定 Relax NG 模式的 XML 文档。在 RNGzip 中,发送方和接收方必须提早赞成使用相同的模式。在这个意义上说,模式相似于用于加密和解密的共享密钥。RNGzip 使用 Relax NG 模式验证程序从指定的模式构建肯定性树自动机。而后,给出一个 XML 文档,用它检查 XML 是否被自动机接受。有了这种自动机,接收方能够经过传输少许信息,重建整个 XML 文档。若是在自动机中有一个选择点,那么 RNGzip 只传输已经完成的转换,若是遇到文本转换,则值传输匹配的文本。
从理论上说,依赖于模式的压缩器可能实现比独立于模式的压缩器更高的压缩比。可是它们并非更好的选择,或一般被用做 XML 文档的模式信息,并不老是可用,从而它们失去了 XML 表示半结构化数据的灵活性。
只有使用此类压缩器来压缩带有预约义模式的 XML 文档时,这类压缩器才是有效的。
XGrind 原理解析
可查询 XML 压缩器。这种 XML 压缩器容许经过其被压缩的格式处理查询。
这种压缩器的压缩比一般比归档 XML 压缩器的压缩比差。这类压缩器主要侧重于避免在查询过程当中进行完整的文档解压缩。
实际上,对被压缩的 XML 格式执行直接查询的能力对于许多托管在资源有限的计算设备上的应用来讲都很是重要,如:移动设备和 GPS 系统。在默认状况下,全部的可查询压缩器也是 XML 感知的压缩器。根据它们如何对 XML 文档的结构和数据部分进行编码,能够对这组压缩器进行进一步分类:
Figure, 根据其是否支持执行查询对 XML 压缩器进行分类
Features:
此类压缩器以压缩格式保留 XML 文档的原始结构,以便可以使用与原始格式相同的方式对其进行访问和解析。
XGrind 是第一个与 XML 有关的压缩方案,支持查询且无需彻底解压整个被压缩的 XML 文档。(但,never been used in 工业界)
XGrind 没有分离数据和结构。它保留了 XML 文档的原始结构。DTD-conscious [Document Type Definition]
XGrind 压缩格式的同质性质为 XGrind 提供了许多有趣的功能:
Encodes elements and attributes using XMill’s approach
DTD-conscious: enumerated attributes with k possible values are encoded using a log2 k-bit scheme
Data values are encoded using non-adaptive Huffman coding
Requires two passes over the input document
Separate statistical model for each element/attribute
Homomorphic compression: compressed document retains original structure
主要是基于简单的mapping。
(非重点)
此类压缩器在 XML 文档的编码过程当中将结构部分和数据部分分隔开。所以,与同质类不一样,压缩后的格式的结构不一样于原始 XML 文档的结构,须要在解压过程当中使用不一样的方式进行解析。
可是,它们能够实现更好的压缩比。例如,XSeq 是基于语法的可查询 XML 压缩方案,它采用了著名的基于语法的文本串压缩算法 Sequitur。
在 XSeq 中,输入 XML 文件的标记被分隔到一组容器中,而后使用 Sequitur 对每一个容器进行压缩。Sequitur 压缩算法是线性时间在线算法,为给定的字符串输入生成了一种与上下文无关的语法。使用定义的上下文无关语法,XSeq 能够避免无关压缩数据的后续扫描,只处理将经过给定查询进行匹配的数据值。此外,上下文无关的语法容许 XSeq 直接经过压缩文件处理查询,而没必要对文件进行所有或部分解压缩。为了关联存储在不一样容器中的数据值并加快查询评估速度,XSeq 使用了一组存储在压缩文件中的索引,并在处理规则内容以前将它们加载到内存中。例如,它使用了一些结构性索引,经过这些索引在容器中快速定位每一个数据值,而无需进行解压缩处理,同时头文件索引中包含指针列表,这些指针指向文件中每一个容器的入口。
TREECHOP XML 压缩器是另外一种可查询 XML 压缩器,在使用该压缩器时,压缩流程以构建 XML 文档的基于 SAX 的解析开始,并按照最深者最早的顺序将已解析的标记写出到压缩流中。每一个节点的代码字的前缀是其父节点的码字,若是 XML 文档树中的两个节点拥有相同的路径,则它们共享相同的代码字。每一个 CDATA 部分、注释、处理指令和非叶节点都被分配一个二进制代码字。该代码字根据树节点的路径进行惟一分配。由于树节点编码都按照最深者最早的顺序被写入压缩流,所以解码器可使用自适应编码信息,以递增方式从新生成原始 XML 文档。在 TREECHOP 中,能够经过压缩流使用单一扫描,执行精确匹配和范围查询。
XQuec 系统基于 XML 文档内的分隔结构和内容,将片断和存储模型用于已压缩的 XML 文档。此外,它经过正确选择将容器进行分组的方法,确保属于同一个组的容器也会在查询谓语中一块儿出现。为了执行压缩域内的谓语评估,它确保涉及到谓语的容器属于同一个组,并采用在压缩域中支持该谓语的算法进行压缩。关于谓语的信息可使用可用查询工做负载进行推测。XQueC 利用查询工做负载信息,根据源模型将容器分为不一样的集,并为每一个集分配最适当的压缩算法。XQueC 还设计了用来评估 XML 查询的代数。该代数由基于成本的优化器使用,该优化器可以自由混合使用常规运算符以及与压缩有关的运算符。