1

有谁知道一种序列化格式:

  1. 是二进制的,至少相对紧凑,
  2. 可以存储 JSON 样式的数据(不是Protobuf、Thrift 等),
  3. 支持遍历(即你不需要解析整个文档来读取其中的一部分),并且
  4. 支持大文件(例如 30 GB)?

我看过以下内容:

  • CBOR - 不支持遍历
  • MessagePack - 不支持遍历
  • UBJSON - 不支持遍历
  • 微笑 - 不支持遍历

  • BSON -支持遍历!但最大文档大小为 2 GB。

BSON 是如此接近,但最大文件大小对我来说是致命的。有没有可以工作的格式?显然我可以自己写,但是二进制 JSON 格式太多了,肯定有人做出了不错的吗?

编辑: “遍历”我的意思与BSON 作者的意思是一样的——你应该能够找到给定的对象而不必解析整个文件。亚马逊将此称为“稀疏”或“浅层”阅读。

4

2 回答 2

1

对于CBOR,我和你有类似的要求;对我来说不受 30GB 的限制是由无限的惰性列表解决的,并且没有单个对象大于 16MB(我只需要 TB 的“中等”大小的块 - 当然,您的要求可能会有所不同)。

但是,由于“可遍历”很容易,因此有一个定义嵌套 CBOR 的 TAG。解码时,您将标签视为不存在。以这种方式,您可以拥有

{ "key1" : [cbor-tag] <<binary-cbor-subtree>>,
  "key2" : [cbor-tag] <<binary-cbor-subtree>>
}

以这种方式,您将“跳过”“值”作为单个解码+搜索,但如果您只是执行 cbor-to-json,则解析器必须将标记的二进制文件解码为 CBOR。因此,您得到两全其美(BSON vs CBOR)既可流式传输(通过无限映射 len)又可遍历。

当然,这需要专门的编码器,但至少解码器应该是微不足道的/标准的。

对我们来说,我们碰巧使用了能够识别标记二进制值的专用编码器/解码器(因为我们需要维护一个潜在巨大值的多 GB 映射)。

于 2021-12-13T19:44:16.233 回答
0

找到一个!亚马逊离子从常见问题解答

许多读取是浅的或稀疏的,这意味着应用程序只关注流中值的一个子集,并且它可以快速确定是否需要一个值的完全实现。

本着这些原则的精神,Ion 规范包括使 Ion 的二进制编码比其他无模式格式更易于阅读的特性。这些功能包括二进制值的长度前缀和 Ion 对符号表的使用。

关于 Ion 的简要说明:

  • 似乎设计得比较好。
  • 所有值都经过 TLV 编码,这使得它可以遍历(是的!)
  • 长度值不限于 32 位(是的!)
  • 它具有比 JSON 稍微丰富的对象模型,例如它支持时间戳、二进制数据、类型注释和 S 表达式(不知道为什么)。
  • 它支持符号表,因此可以对字段名称进行实习!这意味着它可能所有其他二进制 JSON 格式更紧凑。

它不是很受欢迎。库仅适用于几种语言,我什至找不到使用它的命令行工具。不过,如果您想要这些功能,它似乎是唯一的选择!

编辑:

最后,我们选择了非常出色的 SQLite。它并没有真正遵循 JSON 数据模型,但它确实可以让您非常轻松地进行稀疏读取,而且速度非常快。另一种可能性是 DuckDB,它是 SQLite 的一种现代版本,但支持较少。

于 2020-03-02T10:24:25.727 回答