Heim >Backend-Entwicklung >Golang >Wie kann ich Go-Strukturen effizient auf der Festplatte serialisieren und die Dateigröße minimieren?
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!