> 백엔드 개발 > Golang > Go 구조체를 디스크에 효율적으로 직렬화하고 파일 크기를 최소화하려면 어떻게 해야 합니까?

Go 구조체를 디스크에 효율적으로 직렬화하고 파일 크기를 최소화하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-26 12:16:14
원래의
694명이 탐색했습니다.

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

구조체를 디스크로 효율적으로 Go 직렬화

문제:

최소화하여 직렬화 성능 최적화 다음을 사용하여 구조체를 디스크에 인코딩할 때 출력이 부풀어 오른다 gob.

제안된 솔루션:

gob 패키지는 효율적인 직렬화를 제공하지만 인코딩에 유형 정보를 포함하므로 고유 유형당 26바이트의 초기 오버헤드가 발생합니다. . 여러 인스턴스가 있는 구조의 경우 이 오버헤드는 인스턴스 전체에 걸쳐 상각될 수 있습니다.

대안:

이 오버헤드조차 허용되지 않는 애플리케이션의 경우 flate와 같은 압축 기술을 사용하는 것을 고려하세요. zlib, gzip 또는 bzip2를 사용하여 출력 크기를 추가로 줄입니다. 50-80%.

예:

다음 코드는 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
}
로그인 후 복사

인스턴스가 여러 개인 경우 의 항목이 직렬화되고 간접비가 상각됩니다.

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
로그인 후 복사

원하는 컴팩트 직렬화 형식인 경우 추가 압축 기술을 사용할 수 있습니다.

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)
}
로그인 후 복사

압축 기술을 사용한 결과 출력 크기:

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

위 내용은 Go 구조체를 디스크에 효율적으로 직렬화하고 파일 크기를 최소화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿