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 查詢的代數。該代數由基於成本的優化器使用,該優化器可以自由混合使用常規運算符以及與壓縮有關的運算符。