Zstd 壓縮算法 Zstd 壓縮算法

Zstd 壓縮算法

簡介

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

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

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

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

Zstd-jni

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

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

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

代碼示例

添加依賴

// 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 的版本就比較坑了,解壓的時候,還需要給出大小。

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