LZO 是一個用 ANSI C 語言編寫的無損壓縮庫。他能夠提供非常快速的壓縮和解壓功能。解壓並不需要內存的支持。即使使用非常大的壓縮比例進行緩慢壓縮出的數據,依然能夠非常快速的解壓。LZO 遵循 GNU 的 GPL 使用許可。
LZO 非常適合進行數據的實時壓縮解壓處理,這就是說他更關心操作速度,而不是壓縮比例。
LZO 使用 ANSI C 語言編寫,並且壓縮後的數據也被設計為可以跨平台使用的格式。
LZO 擁有如下的特點:
LZO提供多重壓縮,和復原解壓;
LZO 以處理速度為原則設計。解壓速度要快於壓縮速度。能夠提供給任何程序實時解壓的功能。LZO1X的解壓是按照 i386 編碼優化的。
事實上,是通過解壓算法定義的壓縮數據結構,最後采用手工測試數據驗證了這個結構。
在古老的 Pentium 133 的設備上,我們運行了 Calgary Corpus 的測試數據。數據采用了 256 KiB的大小。
LZOxx-N 定義了使用的算法名稱,N代表壓縮級別。1-9 級別使用 64 KiB 內存,他主要提供更快的壓縮速度。99 級別使用 256 KiB 內存,提供更大的壓縮比例,但是處理速度依然很快。999 級別是按照壓縮比例優化的算法,他的壓縮速度很慢,並且使用大量的內存,這種級別一般用於生成預壓縮數據。
C 語言版本的 LZO1X-1 算法要比最快的 ZLIB 壓縮級別,快4-5倍的速度。當然他也在壓縮比例、壓縮時間、解壓時間方便優於 LZRW1-A 和 LZV 這些算法。
+------------------------------------------------------------------------+ | Algorithm Length CxB ComLen %Remn Bits Com K/s Dec K/s | | --------- ------ --- ------ ----- ---- ------- ------- | | | | memcpy() 224401 1 224401 100.0 8.00 60956.83 59124.58 | | | | LZO1-1 224401 1 117362 53.1 4.25 4665.24 13341.98 | | LZO1-99 224401 1 101560 46.7 3.73 1373.29 13823.40 | | | | LZO1A-1 224401 1 115174 51.7 4.14 4937.83 14410.35 | | LZO1A-99 224401 1 99958 45.5 3.64 1362.72 14734.17 | | | | LZO1B-1 224401 1 109590 49.6 3.97 4565.53 15438.34 | | LZO1B-2 224401 1 106235 48.4 3.88 4297.33 15492.79 | | LZO1B-3 224401 1 104395 47.8 3.83 4018.21 15373.52 | | LZO1B-4 224401 1 104828 47.4 3.79 3024.48 15100.11 | | LZO1B-5 224401 1 102724 46.7 3.73 2827.82 15427.62 | | LZO1B-6 224401 1 101210 46.0 3.68 2615.96 15325.68 | | LZO1B-7 224401 1 101388 46.0 3.68 2430.89 15361.47 | | LZO1B-8 224401 1 99453 45.2 3.62 2183.87 15402.77 | | LZO1B-9 224401 1 99118 45.0 3.60 1677.06 15069.60 | | LZO1B-99 224401 1 95399 43.6 3.48 1286.87 15656.11 | | LZO1B-999 224401 1 83934 39.1 3.13 232.40 16445.05 | | | | LZO1C-1 224401 1 111735 50.4 4.03 4883.08 15570.91 | | LZO1C-2 224401 1 108652 49.3 3.94 4424.24 15733.14 | | LZO1C-3 224401 1 106810 48.7 3.89 4127.65 15645.69 | | LZO1C-4 224401 1 105717 47.7 3.82 3007.92 15346.44 | | LZO1C-5 224401 1 103605 47.0 3.76 2829.15 15153.88 | | LZO1C-6 224401 1 102585 46.5 3.72 2631.37 15257.58 | | LZO1C-7 224401 1 101937 46.2 3.70 2378.57 15492.49 | | LZO1C-8 224401 1 100779 45.6 3.65 2171.93 15386.07 | | LZO1C-9 224401 1 100255 45.4 3.63 1691.44 15194.68 | | LZO1C-99 224401 1 97252 44.1 3.53 1462.88 15341.37 | | LZO1C-999 224401 1 87740 40.2 3.21 306.44 16411.94 | | | | LZO1F-1 224401 1 113412 50.8 4.07 4755.97 16074.12 | | LZO1F-999 224401 1 89599 40.3 3.23 280.68 16553.90 | | | | LZO1X-1(11) 224401 1 118810 52.6 4.21 4544.42 15879.04 | | LZO1X-1(12) 224401 1 113675 50.6 4.05 4411.15 15721.59 | | LZO1X-1 224401 1 109323 49.4 3.95 4991.76 15584.89 | | LZO1X-1(15) 224401 1 108500 49.1 3.93 5077.50 15744.56 | | LZO1X-999 224401 1 82854 38.0 3.04 135.77 16548.48 | | | | LZO1Y-1 224401 1 110820 49.8 3.98 4952.52 15638.82 | | LZO1Y-999 224401 1 83614 38.2 3.05 135.07 16385.40 | | | | LZO1Z-999 224401 1 83034 38.0 3.04 133.31 10553.74 | | | | LZO2A-999 224401 1 87880 40.0 3.20 301.21 8115.75 | +------------------------------------------------------------------------+
注解:
LZO 是塊壓縮算法,他壓縮和解壓一個塊數據。壓縮和解壓的塊大小必須一樣。
LZO 將塊數據壓縮成匹配數據(滑動字典)和非匹配的文字序列。LZO 對於長匹配和長文字序列有專門的處理,這樣對於高冗余的數據能夠獲得很好的效果,這樣對於不可壓縮的數據,也能得到較好的結果。
在處理不可壓縮數據時,LZO 將擴展輸入數據,每1024個字節最大增加 64 個字節。
我已經通過類似於 valgrind 這樣的內存檢查工具驗證過 LZO 程序,並且也使用了超過千兆字節的數據,進行各種參數調整,檢查過各種潛在的問題。LZO 目前不存在任何已知 BUG。
這裡實現了很多的算法,但是我希望提供沒有限制的向下兼容性,所以以後並不會取消現有的內容。
就像需要對象文件都是相對獨立的,若通過靜態鏈接使用 LZO 庫,只會增加很少的容量(大約幾KiB),以為內只要在真正使用 LZO 功能時這個模塊才會被加載。
1996年3月,我在 newsgroups.comp.compression 和 comp.compression.research 公布了 LZO1 和 LZO1A。他們主要處理了兼容性的問題。LZO2A解壓的速度非常慢,並且也沒有能提供一個較快的壓縮速度。
在我的試驗中可以看到,LZO1B適合處理大量的數據,或者有高冗余性的數據。LZO1F適合處理小量數據和二進制數據。LZO1X適合各種環境。LZO1Y 和 LZO1Z 跟 LZO1X 很相像,他們能夠在一些環境中達到更好的壓縮比例。
請注意,你有很多的選擇。
無論數據的大小,使用 LZO 庫的基本功能非常的簡單。我們假設你打算使用 LZO1X-1的算法處理你的數據。
壓縮
1 include <lzo/lzo1x.h> 2 call lzo_init () 3 通過 lzo1x_1_compress () 壓縮你的數據 4 編譯連接 LZO 庫
解壓
1 include <lzo/lzo1x.h> 2 call lzo_init () 3 通過 lzo1x_decompress () 解壓數據 4 編譯連接 LZO 庫
在源碼包的 examples/simple.c 有完整的范例代碼。也可以查看 LZO.FAQ 獲得更多內容。