奈飛傾向於使用速度優先的快速資料壓縮演算法
Joey Lynch 是 Netflix 的高階軟體工程師,負責雲資料工程。他花費大量時間在資料庫之間移動資料以及對資料進行雜湊/壓縮。
根據他的所有經驗,他寫了一篇很棒的部落格文章,介紹了您必須處理資料的一些常見任務,他談到了最好的演算法、最差的演算法以及預期的效能差異:
作為一名主要處理資料和資料庫的工程師,我花了很多時間移動資料、雜湊、壓縮、解壓縮,並且通常嘗試透過 TLS 在 VM 和 blob儲存之間剷起資料。我經常驚訝於有多少系統只支援執行這些操作的緩慢、低效和昂貴的方式。
以我的經驗,這些糟糕的演算法選擇比現代替代方案慢幾個數量級。事實上,使用快速演算法通常是實際進行壓縮/雜湊/加密和“嗯,我會跳過它”之間的區別。為了使用我們更多的 CPU 時間來做有用的工作,而不是融化冰蓋和給程式設計師過長的咖啡休息時間,我們將在這篇文章中探索一些更快的替代方案。
常見的不良選擇
- gzip( zlib):一個值得信賴的主力,但也是一個非常慢的演算法。在很多情況下,您的網路速度很快1 Gbps+(
- xz( lzma):一種具有相當好的比率的演算法,但壓縮速度很慢,以至於在實踐中唯一的潛在用例是單寫多讀用例。
- snappy:作為最早的“我會用比率來換取速度”的演算法之一,snappy 在當時是很好的。如今,它幾乎總是優於其他選擇。
如果我關心的是比率
試試 zstd:為了花費更多的壓縮CPU時間以獲得更好的壓縮率,增加壓縮級別或增加塊的大小。我發現在大多數資料庫工作負載中,預設級別(3)甚至是1級是寫量大的資料集的好選擇(越來越接近lz4),10級是讀量大的資料集的好選擇(在每個維度上都超過了gzip)。請注意,zstd嚴格地支配著gzip,因為它更快,而且得到更好的比率。
更棒的是:zstd支援訓練字典,如果你有很多單獨的小而集體的大的JSON資料(看著你的追蹤系統),這真的可以派上用場。
如果我只關心速度
試試lz4:憑藉接近記憶體的速度和體面的比率,這種演算法幾乎總是比完全不壓縮更安全的選擇。它有很好的語言支援,對於實時壓縮/解壓縮來說是特別好的,因為它是如此便宜。
如果我想把資料從這裡鏟到那裡
試試zstd --adapt. :這個功能會隨著IO條件的變化而自動調整壓縮率,以便在CPU和 "保持管道暢通 "之間做出當前的最佳權衡。
例如,如果你的系統有很少的空閒CPU,但有一個快速的網路(看著你的i3en例項),zstd --adapt將自動以較低的水平進行壓縮,以儘量減少總傳輸時間。如果你有一個緩慢的網路和額外的CPU,它將自動在一個較高的級別上進行壓縮。
為什麼快速的資料演算法很重要?
它很重要,因為大多數系統是選擇慢速選項,並使常規開發活動在現代雲基礎設施(快速網路)中花費更多時間。比如說。
- 備份資料。使用gzip和sha256將1 TiB的資料備份到一個快速的blob儲存(可以沉降多個GiBps),需要15個小時左右。用zstd和xxhash做則需要2.2小時。及時備份是資料系統最重要的屬性之一。
- 軟體包。在預設情況下,debian的軟體包要麼不壓縮,要麼用xz壓縮。在一個1G的網路上安裝500 MiB的未壓縮的debian軟體包需要~5s,用xz壓縮實際上會變慢,需要~1s+~6s=~7s,而用zstd -19壓縮需要~1s+~1s=~2s。如果檢查sha256,將再增加~20s,總共~30s,而如果我們用blake3檢查,將增加~0.1s,總共~3s。我寧願選擇3秒而不是30秒。當你構建容器映象、烘烤雲虛擬機器映象或用配置管理(puppet/chef)啟動伺服器時,這一點都很重要。
- 容器映象。預設情況下,docker使用gzip壓縮和sha256校驗,這意味著要解壓和校驗4GiB的容器,我需要大約60s的CPU時間,而不是使用zstd和xxhash的6s(或使用blake3的6.5s)。當你的docker pull在你的應用程式的啟動路徑中時,這很重要。
使用好的演算法的一個主要缺點是它們可能並不總是預設出現在您的語言或作業系統中。我在以下實現方面有很好的經驗:
- xxHash: cli,python和java
- lz4: cli,python和java.
- zstd: cli,python和java.
- blake3:cli和python
- Pinch是我構建的docker 映像 ,因此我可以將雜湊/壓縮技術的瑞士軍刀帶到任何可以執行 docker 的伺服器上。我在 CI/CD 系統上經常使用它。
相關文章
- 關於資料庫壓縮技術的Survey資料庫
- 前端效能優化gzip初探(補充gzip壓縮使用演算法brotli壓縮的相關介紹)前端優化演算法
- 超級簡單的資料壓縮演算法—LZW演算法演算法
- 強大且易於使用的壓縮和解壓縮軟體:Keka for MacMac
- 時序資料是如何被壓縮的?具體有哪些可選擇的壓縮演算法?演算法
- 壓縮資料以節省空間和提高速度(轉)
- 時間序列資料壓縮演算法簡述演算法
- 奈飛的資料網格是什麼樣?
- hive優化-資料傾斜優化Hive優化
- 使用libzip壓縮檔案和資料夾
- 資料壓縮演算法:LZ77 演算法的分析與實現演算法
- linux 高效壓縮工具之xz的壓縮解壓使用Linux
- Blazor 釋出WebAssembly使用Brotli 壓縮提升初次載入速度BlazorWeb
- 【Koa】koa-compress中介軟體的使用-壓縮資料
- MSZIP 演算法是一種壓縮演算法,用於在 Microsoft Windows Installer (MSI) 檔案中壓縮和儲存檔案。它是一種基於 Lempel-Ziv 演算法(LZ77)的演算法,旨在提供高效的檔案壓縮和解壓縮。演算法ROSWindows
- 使用Java API進行tar.gz檔案及資料夾壓縮解壓縮JavaAPI
- 【Go】使用壓縮檔案優化io (二)Go優化
- 【Go】使用壓縮檔案優化io (一)Go優化
- 【Go】使用壓縮檔案優化 io (一)Go優化
- Windows的壓縮資料夾(zip/cab)Windows
- 0910 – iPaste 搞定資料壓縮AST
- 奈飛Netflix兩年資料工程經驗 - XInran
- 分卷壓縮怎麼解壓 快速解壓電腦分卷壓縮檔案方法
- linux 下壓縮與解壓資料夾Linux
- 阿里雲資料庫李飛飛:雲端計算推動資料庫向雲原生快速演進阿里資料庫
- 使用java API進行zip遞迴壓縮資料夾以及解壓JavaAPI遞迴
- 基於優先數系選擇分壓電阻
- AWS Graviton2上資料壓縮演算法效能比較演算法
- Apache開啟gzip壓縮提高網站速度Apache網站
- Nginx效能優化功能- Gzip壓縮(大幅度提高頁面載入速度)Nginx優化
- 高效的資料壓縮編碼方式 Protobuf
- Java實現壓縮資料夾Java
- Hadoop(十九)MapReduce OutputFormat 資料壓縮HadoopORM
- 壓縮演算法一覽演算法
- 壓縮字串《演算法很美》字串演算法
- 【Hive】資料傾斜優化 shuffle, join, group byHive優化
- Ceph Reef(18.2.X)之壓縮演算法和壓縮模式演算法模式
- 基於 NSData 的圖片壓縮