구조체를 디스크로 효율적으로 Go 직렬화: 최소 팽창 달성
gob 직렬화로 생성된 출력이 너무 커졌음에도 불구하고 심층 분석에 따르면 후속 동일한 유형의 항목은 12바이트 오버헤드만 발생합니다. 이 오버헤드는 길이가 4바이트인 두 문자열(길이 접두사 포함)을 인코딩하는 데 필요한 최소 크기를 나타냅니다.
전체 파일 크기를 줄이려면 다음 전략을 고려하세요.
코드 데모:
다음 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!