Zstd 壓縮算法

Zstd 壓縮算法

簡介

最近維護一個老的緩存系統(tǒng),使用RUST語音實現,底層使用磁盤緩存。因為人員離職,打算用JAVA/KOTLIN 重新實現一遍。

考慮到歷史緩存數量比較大,采用灰度模式,復用歷史緩存,只是程序改成JAVA版本。剛剛開始一切比較順利,但是上線以后顯示歷史緩存錯誤,比如hash不一樣。

仔細翻看歷史代碼,底部存儲使用了一種叫做zstd的一種壓縮算法,找找資料,發(fā)現這個還挺牛的,特記錄下。

Zstd,全稱 Zstandard,是 Facebook 于 2016 年開源的新無損壓縮算法。與 zlib、lz4、xz 等當前流行的壓縮算法不同,Zstd 尋求一種壓縮性能與壓縮率通吃的方案,而實際上它也確實做到了。在由官方所列出的表格中,可以看到,Zstd 不僅具備優(yōu)秀的壓縮性能,在壓縮率上也有非常亮眼的表現。官方資料

Zstd-jni

Zstd-jni,顧名思義,是基于 Zstd 本地庫實現的 Java 調用接口。它支持通過 Java 語言實現 Zstd 的壓縮與解壓縮。

在 Zstd-jni 的三方包中,主要實現了以下功能:

  • 提供靜態(tài)的壓縮與解壓縮方法
  • 支持壓縮數據的流式傳輸
  • 支持字典文件的訓練與添加

代碼示例

添加依賴

// https://github.com/luben/zstd-jni
implementation("com.github.luben:zstd-jni:1.4.9-5")

讀取歷史文件,解壓數據,寫入到新文件。

    private fun convertOldToNew(file: File, path: String): File {
        val src = file.inputStream().use { it.readBytes() }
        // 真坑,還要給大小
        val size = when {
            src.size < 10_000 -> src.size * 2
            src.size < 100_000 -> src.size * 3
            else -> src.size * 4
        }
        val dst = ByteArray(size)
        val len = Zstd.decompress(dst, src)

        val newFile = File(config.cacheDirFile(), path).apply { parentFile.mkdirs() }
        newFile.outputStream().use { it.write(dst, 0, len.toInt()) }

        log.error("convert old $file >>> $newFile, $len / ${file.length()}")
        return newFile
    }

Zstd Java Sdk 的版本就比較坑了,解壓的時候,還需要給出大小。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • tl;dr(太長不讀):zstd是Facebook在2016年開源的新無損壓縮算法,優(yōu)點是壓縮率和壓縮/解壓縮性能...
    petergz閱讀 63,255評論 5 16
  • ClickHouse支持多種方式的數據壓縮:LZ4和ZSTD。關于壓縮算法的測試,見這篇文章。簡而言之,LZ4在速...
    Jenray閱讀 10,865評論 1 0
  • 表情是什么,我認為表情就是表現出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,877評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數的可能。 ...
    yichen大刀閱讀 8,156評論 0 4

友情鏈接更多精彩內容