首頁 >後端開發 >Golang >如何有效率地將 Go 結構化序列化到磁碟並最小化檔案大小?

如何有效率地將 Go 結構化序列化到磁碟並最小化檔案大小?

Linda Hamilton
Linda Hamilton原創
2024-12-26 12:16:14690瀏覽

How Can I Efficiently Serialize Go Structs to Disk and Minimize File Size?

結構到磁碟的高效 Go序列化

問題:

透過最小化最佳化序列化效能使用下列指令將結構編碼到磁碟時輸出會膨脹gob.

建議的解決方案:

雖然gob套件提供了高效的序列化,但它在編碼中包含類型訊息,導致每個唯一類型的初始開銷為 26 個位元組。對於具有多個實例的結構,此開銷可以在它們之間分攤。

替代方案:

對於即使這種開銷也是不可接受的應用程序,請考慮使用諸如flate 之類的壓縮技術, zlib、gzip 或bzip2 以進一步減小輸出大小50-80%。

範例:

以下程式碼示範了使用 gob 的單一 Entry 的開銷:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)

type Entry struct {
    Key string
    Val string
}

func main() {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    e := Entry{"k1", "v1"}
    enc.Encode(e)
    fmt.Println(buf.Len()) // Prints 48 bytes
}

如果多個實例的 Entry被序列化,開銷被攤銷:

for i := 0; i < 1000; i++ {
    e.Key = fmt.Sprintf("k%3d", i)
    e.Val = fmt.Sprintf("v%3d", i)
    enc.Encode(e)
}
fmt.Println(buf.Len()) // Prints 16036 bytes = 16.04 bytes/Entry

實現想要緊湊的序列化格式,可以使用額外的壓縮技術:

import (
    "compress/bzip2"
    "compress/flate"
    "compress/gzip"
    "compress/zlib"
)

var out io.Writer
switch name {
case "Naked":
    out = buf
case "flate":
    out, _ = flate.NewWriter(buf, flate.DefaultCompression)
case "zlib":
    out, _ = zlib.NewWriterLevel(buf, zlib.DefaultCompression)
case "gzip":
    out = gzip.NewWriter(buf)
case "bzip2":
    out, _ = bzip2.NewWriter(buf, nil)
}

使用壓縮技術得到的輸出大小:

Technique Output Size Average / Entry
Naked 16036 bytes 16.04 bytes
flate 4120 bytes 4.12 bytes
zlib 4126 bytes 4.13 bytes
gzip 4138 bytes 4.14 bytes
bzip2 2042 bytes 2.04 bytes

以上是如何有效率地將 Go 結構化序列化到磁碟並最小化檔案大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn