【问题标题】:Using Snappy compression on Gob data in Go?在 Go 中对 Gob 数据使用 Snappy 压缩?
【发布时间】:2014-11-17 13:02:23
【问题描述】:

我需要将一个结构保存到磁盘并稍后再次读取它,我试图将 IO 降至最低,但也不花费时间压缩和解压缩文件,因此我打算使用 Snappy 进行压缩它非常快速且相对高效。

通常我会在将 gob 保存到文件时对其进行 gzip 压缩,如下所示:

func (t *Object) Save(filename string) error {
    // Open file for writing
    fi, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer fi.Close()
    // Attach gzip writer
    fz := gzip.NewWriter(fi)
    defer fz.Close()
    // Push from the gob encoder
    encoder := gob.NewEncoder(fz)
    err = encoder.Encode(t.Classifier)
    if err != nil {
        return err
    }
    return nil
}

但是 Snappy 并没有附加到其他所有东西似乎都使用的这些 Reader/Writer 接口。相反,它只提供基本功能: https://godoc.org/code.google.com/p/snappy-go/snappy

func Encode(dst, src []byte) ([]byte, error)

func Decode(dst, src []byte) ([]byte, error)

使用这个 Snappy 包压缩 Gob 数据并将其保存到文件(并读回)的最有效方法是什么?理想情况下,我不想使用 ioutil.ReadAll 从 gob 读取器中读取一个字节,然后重新压缩,因为这似乎是一种非常繁重的方式,会浪费大量内存.

我承认我并不完全了解阅读器和编写器接口的工作原理。

【问题讨论】:

  • 通过查看您链接的包,如果不修改该包的源代码似乎是不可能的。目前唯一的方法是使用 ioutil.ReadAll。如果您需要它以增量方式工作,您将不得不寻找另一种实现或自己编写一个。

标签: go gob


【解决方案1】:

package snappystream

import "github.com/mreiferson/go-snappystream"

snappystream 包装 snappy-go 并为 活泼的帧流格式。

你考虑过 snappystream 包吗?例如,

package main

import (
    "encoding/gob"
    "fmt"
    "os"

    "github.com/mreiferson/go-snappystream"
)

type Object struct {
    Classifier struct{}
}

func (t *Object) Save(filename string) error {
    // Open file for writing
    fi, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer fi.Close()
    // Attach snappy writer
    fs := snappystream.NewBufferedWriter(fi)
    // Push from the gob encoder
    encoder := gob.NewEncoder(fs)
    err = encoder.Encode(t.Classifier)
    if err != nil {
        return err
    }
    err = fs.Close()
    if err != nil {
        return err
    }
    err = fi.Close()
    if err != nil {
        return err
    }
    return nil
}

func main() {
    obj := Object{}
    err := obj.Save("obj.sz")
    if err != nil {
        fmt.Println(err)
    }
}

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多