聊聊數據壓縮

什麼情況適合使用數據壓縮?

數據壓縮不僅能節省存儲空間,還可以用於提升網絡傳輸性能。

通過網絡傳輸數據,使用數據壓縮前後,處理的時間會有一些差別:

  • 壓縮前:傳輸未壓縮數據耗時
  • 壓縮後:壓縮耗時+傳輸壓縮數據耗時+解壓耗時

壓縮和解壓縮的操作都是計算密集型操作,非常耗費CPU資源,如果我們的應用處理業務邏輯本身就需要耗費大量的CPU資源,就不太適合再進行壓縮和解壓縮操作。

如果我們的系統瓶頸在於磁盤IO,同時CPU資源又有大量空閒,那麼就非常適合在將數據寫入磁盤前先進行壓縮。

數據壓縮的本質是資源的置換,是一個時間換空間,或者說CPU資源置換存儲資源的操作。

需要選擇什麼壓縮算法?

壓縮算法可以分爲有損壓縮和無損壓縮,有損壓縮主要用來壓縮音視頻,它在壓縮之後會丟失消息,而無損壓縮的數據,在經過壓縮和解壓縮後,數據是沒有變化的。

目前常用的壓縮算法包括:ZIP、GZIP、SNAPPY、LZ4等,選擇壓縮算法時,主要考慮數據的壓縮率和壓縮耗時。一般來說,壓縮率越高的算法,壓縮耗時也越高。如果對性能要求很高,可以選擇壓縮速度快的算法,比如LZ4,如果需要更高的壓縮比,可以考慮GZIP算法。

壓縮樣本對壓縮速度和壓縮比的影響也是比較大的,同樣大小的一段數字和一段新聞的文本,即使是使用相同的壓縮算法,壓縮率和壓縮時間的差異也是比較大的,所以在選擇壓縮算法之前,可以先嚐試用我們系統中真正使用的數據做一些測試,這樣可以找到最合適的壓縮算法。

如何選擇合適的壓縮分段?

大部分壓縮算法的區別主要在於對數據進行編碼不同,壓縮的流程和壓縮包的結構大致一樣,而在壓縮的過程中,我們需要了解如何選擇合適的壓縮分段大小。

在壓縮時,給定的被壓縮數據必須由確定的長度,或者說是有頭有尾的數據,不能是一個無限的流數據。如果要對流數據進行壓縮,也需要把流數據劃分成多個幀,一幀一幀的分段壓縮。

壓縮算法在開始壓縮之前,一般都需要對被壓縮數據從頭到尾進行一次掃描,掃描的目的是確定如何對數據進行劃分和編碼,一般的原則是重複次數多、佔用空間大的內容,使用盡量短的編碼,這樣壓縮率會更高。

被壓縮的數據長度越大,重碼率會越高,壓縮比也就越高。

分段也不是越大越好,實際上分段大小超過一定長度後,再增加長度對壓縮率的共享就不大了,同時,過大的分段長度,在解壓縮時,會有更多的解壓浪費。

我們需要根據具體的業務場景,選擇合適的壓縮分段,在壓縮率、壓縮速度和解壓浪費之間找到一個合適的平衡。

Kafka如何處理消息壓縮?

Kafka是否開啓消息壓縮,是可以進行配置的,它也支持配置使用哪一種壓縮算法。

在開啓壓縮時,Kafka選擇一批消息一起壓縮,每一批消息就是一個壓縮分段。使用者也可以通過參數來控制每批消息的大小。

Kafka並不需要在服務端對接收到的批消息進行解壓,而是整批直接存儲,然後將其發送給消費者,由消費者對批消息進行解壓處理。

不在服務端解壓,就不會耗費服務端的CPU資源,同時傳遞消息數據時,真用的傳輸帶寬也會小。

在使用Kafka時,如果生產者和消費者的CPU資源不是特別喫緊,開啓壓縮後,可以節省網絡帶寬和服務端的存儲空間,提升總體的吞吐量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章