Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mensiri Struktur Go dengan Cekap ke Cakera dan Meminimumkan Saiz Fail?

Bagaimanakah Saya Boleh Mensiri Struktur Go dengan Cekap ke Cakera dan Meminimumkan Saiz Fail?

Linda Hamilton
Lepaskan: 2024-12-26 12:16:14
asal
697 orang telah melayarinya

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

Pensirilan Go yang Cekap bagi Struct to Disk

Masalah:

Mengoptimumkan prestasi siri dengan meminimumkan mengembung dalam output apabila pengekodan struct ke cakera menggunakan gob.

Cadangan Penyelesaian:

Walaupun pakej gob menyediakan penyiaran yang cekap, ia termasuk maklumat jenis dalam pengekodan, menghasilkan overhed awal sebanyak 26 bait bagi setiap jenis unik . Untuk struktur dengan berbilang kejadian, overhed ini boleh dilunaskan merentasnya.

Alternatif:

Untuk aplikasi yang overhed ini tidak boleh diterima, pertimbangkan untuk menggunakan teknik mampatan seperti flate, zlib, gzip atau bzip2 untuk mengurangkan lagi saiz output dengan 50-80%.

Contoh:

Kod berikut menunjukkan overhed Entri tunggal menggunakan gob:

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
}
Salin selepas log masuk

Jika berbilang kejadian daripada Kemasukan bersiri, overhed dilunaskan:

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
Salin selepas log masuk

Untuk mencapai padat yang diingini format siri, teknik mampatan tambahan boleh digunakan:

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)
}
Salin selepas log masuk

Saiz output yang terhasil dengan teknik mampatan:

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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mensiri Struktur Go dengan Cekap ke Cakera dan Meminimumkan Saiz Fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan