時間序列數據庫壓縮


無損壓縮

無損壓縮是說被壓縮的數據和解壓后的數據完全一樣,不存在精度的損失。對數據的壓縮說到底是對數據規律性的總結。時序數據的規律可以總結為兩點:1、timestamp 穩定遞增、2、數值有規律性,變化穩定。下面來舉個例子。

上圖是一組時序數據,如果我們一行一行的看感覺壓縮有點困難,但如果我們一列一列的看,壓縮方案就呼之欲出了。

先看 timestamp 那一列是等差遞增數列,可以用 [1467627245000,1000,4] 來表示。1467627245000 代表了第一個時間,1000 代表后一個時間比前一個時間的大 1000,4 代表了這樣的規律出現了 4 次。如果一共有 100 個這樣規律的 timestamp,那就意味着,我們用 3 個 Long 型就可以表示出來。timestamp 壓縮率高達 33。

再進一步觀察看 value 那一列,如果取差值,可以得到(6,-5,2,-5),全部都加 5 得到(11,0,7,0),這些數值都可以用 4bit 來表示。也就是用 [23,5,4,0xb0700000] 來表示(23,22,24,25,24)。其中的 4 代表后續一共有 4 個數。如果這樣的規律一直維持到 100 個 Int 的 value,就可以用 16 個 Int 來代表,壓縮率高達 6.3。

具體的情景會復雜很多,在此只是簡單舉個例子。InfluxDB 無損壓縮算法在其頁面上有完整的闡述(注 3),可以配合開源源碼進行更加深入的理解。針對於浮點數類型,Facebook 在 Gorilla 論文中(注 4)提到的非常高效的無損壓縮算法,已經有很多文章進行分析。InfluxDB 對於浮點型也采用這個算法。

 

有損壓縮

有損壓縮的意思是說解壓后的數據和被壓縮的數據在精度上有損失,主要針對於浮點數。通常都會設置一個壓縮精度,控制精度損失。時序數據的有損壓縮的思路是擬合。也就是用一條線盡可能的匹配到這些點,可以是直線,也可以是曲線。

最有名的時序數據有損壓縮是 SOIsoft 公司的 SDA 算法,中文稱為旋轉門壓縮算法。

在上圖中,紅色的點是上一個記錄的點,空心的點是被丟掉的點,綠色的點是當前的點,黑色的點是當前要記錄的點。

可以看到圖左邊,當前點和上一個記錄點以及壓縮精度的偏差值形成的矩形可以包含中間的點,所以這些點都是可以丟掉的。

再看圖右邊,當前點和上一個記錄點形成的矩形無法包含中間的點,所以把上一個點記錄下來。如此進行下去,可以看到,大部分的數據點都會被丟掉。查詢的時候需要根據記錄的點把丟掉的點在插值找回來。

有損壓縮除了可以大幅減少存儲成本。如果結合設備端的能力,甚至可以減少數據的寫入,降低網絡帶寬。

總結

雖然判斷壓縮算法最優是不可計算的,但是設計好的壓縮算法仍然是可計算的問題。可以看到,前面提到的時序數據的無損壓縮有損壓縮算法都會基於時序數據的特征采取方案,達到更好的壓縮率。現在 deep learning 非常的火,讓人很好奇它是不是可以給數據壓縮帶來新的方案。

 

摘自:http://www.infoq.com/cn/articles/condense-in-sequential-databases


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM