Maison > développement back-end > Golang > Comment puis-je sérialiser efficacement les structures Go sur le disque et minimiser la taille des fichiers ?

Comment puis-je sérialiser efficacement les structures Go sur le disque et minimiser la taille des fichiers ?

Linda Hamilton
Libérer: 2024-12-26 12:16:14
original
696 Les gens l'ont consulté

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

Sérialisation Go efficace de Struct sur disque

Problème :

Optimisation des performances de sérialisation en minimisant gonflement de la sortie lors de l'encodage des structures sur le disque à l'aide de gob.

Solution proposée :

Bien que le package gob fournisse une sérialisation efficace, il inclut des informations de type dans l'encodage, ce qui entraîne une surcharge initiale de 26 octets par type unique. . Pour les structures comportant plusieurs instances, cette surcharge peut être amortie sur chacune d'elles.

Alternative :

Pour les applications où même cette surcharge est inacceptable, envisagez d'utiliser des techniques de compression telles que flate, zlib, gzip ou bzip2 pour réduire davantage la taille de sortie de 50-80 %.

Exemple :

Le code suivant illustre la surcharge d'une seule entrée utilisant 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
}
Copier après la connexion

Si plusieurs instances d'entrée sont sérialisés, la surcharge est amortie :

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
Copier après la connexion

Pour obtenir le format de sérialisation compact souhaité, des techniques de compression supplémentaires peut être utilisé :

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)
}
Copier après la connexion

Les tailles de sortie résultantes avec des techniques de compression :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal