Heim >Backend-Entwicklung >Golang >Wie kann ich Go-Strukturen effizient auf der Festplatte serialisieren und die Dateigröße minimieren?

Wie kann ich Go-Strukturen effizient auf der Festplatte serialisieren und die Dateigröße minimieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 12:16:14692Durchsuche

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

Effiziente Go-Serialisierung von Struct to Disk

Problem:

Optimierung der Serialisierungsleistung durch Minimierung Beim Codieren von Strukturen auf die Festplatte wird die Ausgabe aufgebläht gob.

Vorgeschlagene Lösung:

Während das gob-Paket eine effiziente Serialisierung bietet, schließt es Typinformationen in die Codierung ein, was zu einem anfänglichen Overhead von 26 Bytes pro eindeutigem Typ führt . Bei Strukturen mit mehreren Instanzen kann dieser Overhead über alle Instanzen amortisiert werden.

Alternative:

Für Anwendungen, bei denen selbst dieser Overhead nicht akzeptabel ist, sollten Sie die Verwendung von Komprimierungstechniken wie Flate in Betracht ziehen. zlib, gzip oder bzip2, um die Ausgabegröße weiter zu reduzieren 50-80 %.

Beispiel:

Der folgende Code demonstriert den Overhead eines einzelnen Eintrags mit 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
}

Bei mehreren Instanzen von Entry serialisiert werden, wird der Overhead amortisiert:

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

Um die gewünschte kompakte Serialisierung zu erreichen Format können zusätzliche Komprimierungstechniken verwendet werden:

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

Die resultierenden Ausgabegrößen mit Komprimierungstechniken:

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

Das obige ist der detaillierte Inhalt vonWie kann ich Go-Strukturen effizient auf der Festplatte serialisieren und die Dateigröße minimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn