当前位置: 首页 > 面试题库 >

结构到磁盘的有效Go序列化

夏宏旷
2023-03-14
问题内容

我的任务是将C ++代码替换为Go,我对Go API还是很陌生。我正在使用gob对磁盘页面上的数百个键/值条目进行编码,但是gob编码不需要太多膨胀。

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)
type Entry struct {
    Key string
    Val string
}

func main() {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    e := Entry { "k1", "v1" }
    enc.Encode(e)
    fmt.Println(buf.Bytes())
}

这产生了很多我不需要的膨胀:

[35 255 129 3 1 1 5 69 110 116 114 121 1 255 130 0 1 2 1 3 75 101 121 1 12 0 1 3 86 97 108 1 12 0 0 0 11 255 130 1 2 107 49 1 2 118 49 0]

我想序列化每个字符串的len,然后再序列化原始字节,例如:

[0 0 0 2 107 49 0 0 0 2 118 49]

我保存了数百万个条目,因此编码中的额外膨胀使文件大小增加了大约10倍。

没有手动编码,如何将其序列化为后者?


问题答案:

使用protobuf有效地编码您的数据。

https://github.com/golang/protobuf

您的主体看起来像这样:

package main

import (
    "fmt"
    "log"

    "github.com/golang/protobuf/proto"
)

func main() {
    e := &Entry{
        Key: proto.String("k1"),
        Val: proto.String("v1"),
    }
    data, err := proto.Marshal(e)
    if err != nil {
        log.Fatal("marshaling error: ", err)
    }
    fmt.Println(data)
}

您可以这样创建一个文件example.proto:

package main;

message Entry {
    required string Key = 1;
    required string Val = 2;
}

您可以通过运行以下命令从原始文件生成go代码:

$ protoc --go_out=. *.proto

您可以根据需要检查生成的文件。

您可以运行并查看结果输出:

$ go run *.go
[10 2 107 49 18 2 118 49]


 类似资料:
  • 主要内容:一、磁盘结构的内容,二、表空间,三、数据字典,四、双写缓冲区,五、日志,六、总结一、磁盘结构的内容 InnoDB磁盘结构主要包含表空间,数据字典,双写缓冲区、日志(重做日志和撤销日志)。说起内存结构和磁盘结构,很多人可能有点晕,确实,刚刚接触的或者没有搞清楚是什么问题的,一定会有些晕。其实这个如果搞过内存数据写物理文件的,就容易理解了。在内存中,会有一套数据结构,然后会把这些数据最终整理成一套易于和硬盘交互的结构,这样,就更容易程序的编写和维护。 如果单纯是为了实现功能,写代

  • 有多种磁盘数据结构用于实现文件系统。 该结构可能会因操作系统而异。 1. 引导控制块 启动控制块包含从该卷启动操作系统所需的所有信息。 它在UNIX文件系统中被称为引导块。 在NTFS中,它被称为分区引导扇区。 2. 卷控制块 卷控制会阻止有关该音量的所有信息,如块的数量,每个块的大小,分区表,指向空闲块和空闲FCB块的指针。 在UNIX文件系统中,它被称为超级块。 在NTFS中,此信息存储在主文

  • 主要内容:一、基本介绍,二、表空间,三、数据字典,四、双写缓冲区,五、日志,六、总结一、基本介绍 在前面的一篇中初步对InnoDB磁盘结构的表空间,数据字典,双写缓冲区、日志进行分析说明,对InnoDB的磁盘结构有了一个整体上的概念上的认识。这样,在下面的源码分析中,就可以比较清楚的把功能和源码的内容就对起来,做到心中有数,看代码才不会一头雾水。 二、表空间 表空间是InnoDB在文件IO上的一层逻辑存储空间管理的结构,它基本可以分为space、segment inode、ext

  • 主要内容:一、表空间的文件类型,二、表空间文件格式,三、应用流程,四、总结一、表空间的文件类型 表空间的文件类型其实就文件的具体类型,在前面谈到过表空间的上层逻辑分层,最下面一层是通过Page来实现的,也就是说,文件的底层就是通过链表来控制这个页数据。而这些页数据的具体保存到硬盘中,主要为为两类,即: FSP_HDR/XDES Page和fseg inodes Page。 page的默认大小为16K,在InnoDB中extent是分配页的基本单位,每个extent包含6

  • 以下各节的脚本展示了如何监控磁盘和I/O活动。 统计磁盘读写状况 本节展示了如何找出磁盘读写最频繁的进程。 disktop.stp #!/usr/bin/env stap # # Copyright (C) 2007 Oracle Corp. # # Get the status of reading/writing disk every 5 seconds, # output top ten e

  • 我需要将一个pojo序列化成不同的json结构,这取决于我发送请求的对象。此外,我应该能够在一些配置中配置pojo字段如何映射到给定请求的json属性。 这可以用杰克逊来实现吗?是否有一些库或API可以做到这一点? 编辑:例如: 上面是我创建动态json需要的两个对象,下面是一些转换的例子