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

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

Barbara Streisand
Barbara Streisandasal
2025-01-01 13:05:10205semak imbas

How Can I Efficiently Serialize Go Structs to Disk with Minimal File Size?

Pensirilan Go yang Cekap bagi Struktur ke Cakera: Mencapai Kembung Minimum

Walaupun keluaran membuak-buak yang dihasilkan oleh siri gob, analisis yang lebih mendalam mendedahkan bahawa seterusnya entri daripada jenis yang sama hanya dikenakan overhed 12 bait. Overhed ini mewakili saiz minimum yang diperlukan untuk mengekod dua rentetan panjang 4 bait (termasuk awalan panjang).

Untuk mengurangkan saiz fail keseluruhan, pertimbangkan strategi berikut:

  • Gunakan Berbilang Kejadian Pengekod: Melunaskan kos kompilasi codec tersuai merentas berbilang pengekod boleh mengurangkan dengan ketara overhed untuk entri pertama.
  • Mampat Output: Menggunakan perpustakaan mampatan seperti compress/flate atau bzip2 boleh mengurangkan lagi saiz fail, dengan bzip2 mencapai kecekapan tertinggi dalam ujian yang disediakan (2.04 bait/Entri).

Kod Demonstrasi:

Kod Go berikut menunjukkan pelbagai pendekatan yang dibincangkan:

package main

import (
    "bytes"
    "compress/bzip2"
    "compress/flate"
    "compress/gzip"
    "compress/zlib"
    "encoding/gob"
    "fmt"
    "io"
)

type Entry struct {
    Key string
    Val string
}

func main() {
    // Create test data
    entries := make([]Entry, 1000)
    for i := 0; i < 1000; i++ {
        entries[i].Key = fmt.Sprintf("k%03d", i)
        entries[i].Val = fmt.Sprintf("v%03d", i)
    }

    // Test different encoding/compression techniques
    for _, name := range []string{"Naked", "flate", "zlib", "gzip", "bzip2"} {
        buf := &bytes.Buffer{}

        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)
        }

        enc := gob.NewEncoder(out)
        for _, e := range entries {
            enc.Encode(e)
        }

        if c, ok := out.(io.Closer); ok {
            c.Close()
        }
        fmt.Printf("[%5s] Length: %5d, average: %5.2f / Entry\n",
            name, buf.Len(), float64(buf.Len())/1000)
    }
}

Output:

[Naked] Length: 16053, average: 16.05 / Entry
[flate] Length:  3988, average:  3.99 / Entry
[ zlib] Length:  3994, average:  3.99 / Entry
[ gzip] Length:  4006, average:  4.01 / Entry
[bzip2] Length:  1977, average:  1.98 / Entry

Seperti yang terbukti daripada output, menggunakan teknik pemampatan dengan ketara mengurangkan saiz fail, dengan bzip2 mencapai 1.98 bait/Entri.

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

Kenyataan:
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