我一直致力于将基数树(用于索引(序列化到golang中的文件。基数树节点存储6位咆哮位图(请参阅https://github.com/RoaringBitmap/roaring)。以下代码是我正在使用的,以及当我试图将其加载回内存时得到的输出:
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)
}
输出:
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个字节,但它们是空加载的(咆哮的位图不见了(:
post encode map[dan:map[] dan1:map[] goodman:map[]]
我觉得这与我试图序列化map[string]interface{}
而不是map[string]int
有关,但我对golang仍然很满意。
请参阅https://repl.it/@danthegoodman/SelfishMoraleCharactermapping#main.go作为一个例子和我的测试。
我相信我通过在写入磁盘之前将map[string]interface{}
转换为map[string]*roaring64.Bitmap
,然后将其解码回map[string]*roaring64.Bitmap
,再将其转换回map[string]interface{}
来修复它
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的工作示例