对Go中的Gob数据使用Snappy压缩?
我需要将一个结构保存到磁盘,稍后再读取它,我试图将IO控制在最低限度,但也不会花费太多时间压缩和解压缩文件,因此我打算使用Snappy进行压缩,因为它非常快速且相对高效 通常,我会在将gob保存到文件时对其进行gzip压缩,如下所示:对Go中的Gob数据使用Snappy压缩?,go,gob,Go,Gob,我需要将一个结构保存到磁盘,稍后再读取它,我试图将IO控制在最低限度,但也不会花费太多时间压缩和解压缩文件,因此我打算使用Snappy进行压缩,因为它非常快速且相对高效 通常,我会在将gob保存到文件时对其进行gzip压缩,如下所示: func (t *Object) Save(filename string) error { // Open file for writing fi, err := os.Create(filename) if err != nil {
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并没有附加到其他所有东西似乎都在使用的这些读写器接口上。相反,它只提供基本功能:
func编码(dst,src[]字节)([]字节,错误)
func解码(dst,src[]字节)([]字节,错误)
在将Gob数据保存到文件(并将其读回)时,使用此Snappy软件包压缩Gob数据的最有效方法是什么?理想情况下,我不想使用ioutil.ReadAll将gob读取器中的数据读入一个字节片,然后重新压缩,因为这似乎是一种非常繁重的方式,会造成大量内存浪费
我承认我不完全理解读者和作者界面是如何工作的
snappystream包装snappy go,并为
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)
}
}
从您链接的包来看,不修改该包的源代码似乎是不可能的。目前唯一的方法是使用ioutil.ReadAll。如果您需要它以增量方式工作,那么您必须寻找另一个实现,或者自己编写一个实现。
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)
}
}