Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Go中的Gob数据使用Snappy压缩?_Go_Gob - Fatal编程技术网

对Go中的Gob数据使用Snappy压缩?

对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 {

我需要将一个结构保存到磁盘,稍后再读取它,我试图将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并没有附加到其他所有东西似乎都在使用的这些读写器接口上。相反,它只提供基本功能:

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)
    }
}