Maison >développement back-end >Golang >Comment puis-je sérialiser efficacement les structures Go sur le disque et minimiser la taille des fichiers ?
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 }
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
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) }
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!