首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang序列化go-radix树到文件?

Golang序列化go-radix树到文件?
EN

Stack Overflow用户
提问于 2020-10-26 07:20:51
回答 1查看 143关注 0票数 1

我一直致力于将基数树(用于索引)序列化为golang中的文件。基数树节点存储6位咆哮位图(参见https://github.com/RoaringBitmap/roaring)。以下代码是我正在使用的代码,以及我在尝试将其加载回内存时得到的输出:

代码语言:javascript
复制
serializedTree := i.index.ToMap()
    encodeFile, err := os.Create(fmt.Sprintf("./serialized/%s/%s", appindex.name, i.field))
    if err != nil {
        panic(err)
    }
    e := gob.NewEncoder(encodeFile)
    err = e.Encode(serializedTree)
    encodeFile.Close()
    // Turn it back for testing
    decodeFile, err := os.Open(fmt.Sprintf("./serialized/%s/%s", appindex.name, i.field))
    defer decodeFile.Close()
    d := gob.NewDecoder(decodeFile)
    decoded := make(map[string]interface{})
    err = d.Decode(&decoded)
    fmt.Println("before decode", serializedTree)
    fmt.Println("after decode", decoded)
    if err != nil {
        fmt.Println("!!! Error serializing", err)
        panic(err)
    }

输出:

代码语言:javascript
复制
before decode map[dan:{1822509180252590512} dan1:{6238704462486574203} goodman:{1822509180252590512,6238704462486574203}]
after decode map[]
!!! Error serializing EOF
panic: EOF

goroutine 1 [running]:
main.(*appIndexes).SerializeIndex(0xc000098240)

(我知道解码是空的,因为gob包不会在EOF错误时进行修改)

我注意到,当尝试直接使用字节时,磁盘上只存储了15个字节(这太少了)。尝试使用json.Marshall()json.Unmarshall()encoding/json包,我看到存储了33个字节,但它们是空加载的(咆哮的位图消失了):

代码语言:javascript
复制
post encode map[dan:map[] dan1:map[] goodman:map[]]

我觉得这与我正在尝试序列化map[string]interface{}而不是像map[string]int这样的东西有关,但我仍然对golang很陌生。

有关示例和我的测试,请参阅https://repl.it/@danthegoodman/SelfishMoralCharactermapping#main.go

EN

回答 1

Stack Overflow用户

发布于 2020-10-26 07:47:10

我相信我修复了这个问题:在写入磁盘之前将map[string]interface{}转换为map[string]*roaring64.Bitmap,然后将其解码回map[string]*roaring64.Bitmap,然后再将其转换回map[string]interface{}

代码语言:javascript
复制
m2 := make(map[string]*roaring64.Bitmap)

// Convert m1 to m2

for key, value := range m1 {
  m2[key] = value.(*roaring64.Bitmap)
}

fmt.Println("m1", m1)
fmt.Println("m2", m2)

encodeFile, err := os.Create("./test")
    if err != nil {
        panic(err)
    }
    e := gob.NewEncoder(encodeFile)
    err = e.Encode(m2)
    encodeFile.Close()
    // Turn it back for testing
    decodeFile, err := os.Open("./test")
    defer decodeFile.Close()
    d := gob.NewDecoder(decodeFile)
    decoded := make(map[string]*roaring64.Bitmap)
    err = d.Decode(&decoded)
    fmt.Println("before decode", m2)
    fmt.Println("after decode", decoded)
    if err != nil {
        fmt.Println("!!! Error serializing", err)
        panic(err)
    }

m3 := make(map[string]interface{})

// Convert m2 to m3

for key, value := range m2 {
  m3[key] = value
}

afterDecTree := radix.NewFromMap(m3)

有关工作示例,请参见https://repl.it/@danthegoodman/VictoriousUtterMention#main.go

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64529808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档