我需要将结构保存到磁盘并稍后再次读取它,我正在尝试将IO保持在最低限度,但也不会花费很长时间来压缩和解压缩文件,所以我打算使用Snappy进行压缩它非常快速且相对有效。
通常我会在将gob保存到文件时压缩gobip,如下所示:
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没有附加到这些读者/编写器接口上,其他一切似乎都在使用。相反,它只提供基本功能: 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阅读器读取到一片字节然后再重新压缩,因为这似乎是一种非常沉重的方式,这会造成大量浪费的内存
我承认我并不完全理解读写器界面的工作原理。
答案 0 :(得分:4)
import "github.com/mreiferson/go-snappystream"
snappystream包装snappy-go并为其提供Reader和Writer snappy框架流格式。
您是否考虑过套餐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)
}
}