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

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

Barbara Streisand
풀어 주다: 2025-01-01 13:05:10
원래의
197명이 탐색했습니다.

How Can I Efficiently Serialize Go Structs to Disk with Minimal File Size?

구조체를 디스크로 효율적으로 Go 직렬화: 최소 팽창 달성

gob 직렬화로 생성된 출력이 너무 커졌음에도 불구하고 심층 분석에 따르면 후속 동일한 유형의 항목은 12바이트 오버헤드만 발생합니다. 이 오버헤드는 길이가 4바이트인 두 문자열(길이 접두사 포함)을 인코딩하는 데 필요한 최소 크기를 나타냅니다.

전체 파일 크기를 줄이려면 다음 전략을 고려하세요.

  • 여러 인코더 인스턴스 사용: 여러 인코더에 걸쳐 사용자 지정 코덱의 컴파일 비용을 상각하면 첫 번째 오버헤드를 크게 줄일 수 있습니다. 항목.
  • 출력 압축:compress/flate 또는 bzip2와 같은 압축 라이브러리를 사용하면 파일 크기를 더욱 줄일 수 있으며, bzip2는 제공된 테스트에서 가장 높은 효율성을 달성합니다(2.04바이트/항목). .

코드 데모:

다음 Go 코드는 논의된 다양한 접근 방식을 보여줍니다.

package main

import (
    "bytes"
    "compress/bzip2"
    "compress/flate"
    "compress/gzip"
    "compress/zlib"
    "encoding/gob"
    "fmt"
    "io"
)

type Entry struct {
    Key string
    Val string
}

func main() {
    // Create test data
    entries := make([]Entry, 1000)
    for i := 0; i < 1000; i++ {
        entries[i].Key = fmt.Sprintf("k%03d", i)
        entries[i].Val = fmt.Sprintf("v%03d", i)
    }

    // Test different encoding/compression techniques
    for _, name := range []string{"Naked", "flate", "zlib", "gzip", "bzip2"} {
        buf := &bytes.Buffer{}

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

        enc := gob.NewEncoder(out)
        for _, e := range entries {
            enc.Encode(e)
        }

        if c, ok := out.(io.Closer); ok {
            c.Close()
        }
        fmt.Printf("[%5s] Length: %5d, average: %5.2f / Entry\n",
            name, buf.Len(), float64(buf.Len())/1000)
    }
}
로그인 후 복사

출력:

[Naked] Length: 16053, average: 16.05 / Entry
[flate] Length:  3988, average:  3.99 / Entry
[ zlib] Length:  3994, average:  3.99 / Entry
[ gzip] Length:  4006, average:  4.01 / Entry
[bzip2] Length:  1977, average:  1.98 / Entry
로그인 후 복사

압축 기술을 사용하여 출력하면 파일 크기가 크게 줄어들며 bzip2는 인상적인 1.98을 달성합니다. 바이트/항목.

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

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