我需要将一个结构保存到磁盘并稍后再次读取它,我试图将 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
}
Run Code Online (Sandbox Code Playgroud)
但是 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 读取器读取一个字节,然后再次压缩它,因为这似乎是一种非常繁重的方法,会造成大量浪费的内存.
我承认我并不完全理解读写器接口是如何工作的。
Run Code Online (Sandbox Code Playgroud)import "github.com/mreiferson/go-snappystream"snappystream 包装了 snappy-go 并为 snappy 框架流格式提供了一个 Reader 和 Writer。
你考虑过包 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)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1399 次 |
| 最近记录: |