【发布时间】:2020-06-14 03:17:21
【问题描述】:
有谁知道一种序列化格式:
- 是二进制的,至少相对紧凑,
- 可以存储 JSON 样式的数据(不是 Protobuf、Thrift 等),
- 支持遍历(即您无需解析整个文档即可读取其中的一部分),并且
- 支持大文件(例如 30 GB)?
我看过以下内容:
- CBOR - 不支持遍历
- MessagePack - 不支持遍历
- UBJSON - 不支持遍历
微笑 - 不支持遍历
BSON - 支持遍历!但最大文档大小为 2 GB。
BSON 非常接近,但最大文件大小对我来说是致命的。有没有可以工作的格式?显然我可以自己写,但是二进制 JSON 格式实在是太多了,肯定有人做出了不错的吗?
编辑:“遍历”我的意思与the BSON authors mean 相同——您应该能够找到给定对象而无需解析整个文件。亚马逊称之为“稀疏”或“浅层”阅读。
【问题讨论】:
-
您能否详细说明“遍历”和“不需要解析整个文档”的含义。您实际上是指“随机访问”吗?所有可反序列化的数据格式都将支持对数据的访问,而无需将整个事物作为反序列化保存在内存中,但它们通常依赖于从一开始就读取数据,因为没有随机访问索引告诉反序列化器事物在哪里。请准确说明您要查找的内容。
-
已澄清。 “随机访问”仅适用于数据序列,而 JSON 不是,因此它不是完全正确的术语,但它基本上是正确的想法。当然,所有格式都允许您丢弃已解析的数据 - 这就是为什么我说您不需要解析整个文档。
-
不,但也不完全准确。您在提供的答案中提到了具有长度前缀二进制文件的格式,我假设为字符串。在 BSON 类型的事物的意义上,这意味着您可能不必解析字符串来处理诸如转义字符等之类的事情,您可以直接跳过字节,但是这样的字符串的二进制编码可能会'当它从文本格式转换为二进制时,已经完成了这种处理。
-
在BSON支持遍历的意义上,那么我想说所有数据格式都支持遍历,因为它们支持完全反序列化。部分反序列化/内存处理将是反序列化代码的属性,而不是格式的属性。换句话说,CBOR 不支持遍历的事实意味着支持 CBOR 的已知库不支持遍历,但应该可以创建这样的支持。可能比它的价值更多的工作,我会给你。
-
另外,我不确定 2GB 是 BSON 的实际限制,但它是内部属性的限制。所以任何单个字符串都不能大于 2GB,但我不确定该限制是否适用于整个文档,但是我不会将 BSON 用于这种大数据,所以我不确定我是否知道所有内容关于这个。
标签: json serialization bson json-serialization cbor