【问题标题】:Looking for a fast, compact, streamable, multi-language, strongly typed serialization format寻找一种快速、紧凑、可流式传输、多语言、强类型的序列化格式
【发布时间】:2010-11-14 13:35:00
【问题描述】:

我目前在我的 Java 项目中使用 JSON(通过 gzip 压缩),其中我需要在磁盘上存储大量对象(数亿)。我每行有一个 JSON 对象,并且不允许在 JSON 对象中使用换行符。通过这种方式,我可以逐行从磁盘流式传输数据,而无需一次读取整个文件。

事实证明,解析 JSON 代码(使用 http://www.json.org/java/)比将原始数据从磁盘中提取或解压缩(我在运行中进行)的开销更大。

理想情况下,我想要的是一种强类型的序列化格式,我可以在其中指定“此对象字段是字符串列表”(例如),并且因为系统知道会发生什么,它可以快速反序列化它.我也可以通过给别人它的“类型”来指定格式。

它还需要是跨平台的。我使用 Java,但与使用 PHP、Python 和其他语言的人一起工作。

所以,回顾一下,应该是:

  • 强类型
  • 可流式传输(即逐位读取文件,而无需一次将其全部加载到 RAM 中)
  • 跨平台(包括Java和PHP)
  • 快速
  • 免费(如演讲)

任何指针?

【问题讨论】:

  • 如果从磁盘上提取原始数据更快,为什么不这样做呢?如果 JSON 速度较慢,为什么还要乱用它?
  • 好的,所以解析 json 比解压缩,或者从磁盘读取数据要慢。所以呢?对于您需要做的事情来说太慢了吗?或者你只是为了它而优化?
  • 布列塔尼:对于我需要做的事情来说太慢了,这不是过早的优化。

标签: java php serialization strong-typing


【解决方案1】:

您看过 Google 协议缓冲区吗?:

http://code.google.com/apis/protocolbuffers/

它们是跨平台的(C++、Java、Python),还带有 PHP 的第三方绑定。它速度快、相当紧凑且类型强大。

这里还有各种格式之间的有用比较:

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

您可能还想考虑 Thrift 或此处提到的其他产品之一。

【讨论】:

  • ...而且,Google 支持它。
【解决方案2】:

我在使用Jackson 解析 JSON 时取得了非常好的结果

杰克逊是一个:

  • 流式传输(读取、写入)
  • FAST(比任何其他 Java json 解析器和数据绑定器都快)
  • 功能强大(通用 JDK 类以及任何 Java bean 类、Collection、Map 或 Enum 的完整数据绑定)
  • 零依赖(不依赖JDK以外的其他包)
  • 开源(LGPL 或 AL)
  • 完全符合

用 Java 编写的 JSON 处理器(JSON 解析器 + JSON 生成器)。除了基本的 JSON 读/写(解析、生成)之外,它还提供完整的基于节点的树模型,以及完整的 OJM(Object/Json Mapper)数据绑定功能。

与许多其他序列化选项相比,它的performance 非常好。

【讨论】:

  • 在尝试其他任何事情之前先使用 Jackson。 json.org 上的代码不适合生产使用。
【解决方案3】:

你可以看看 YAML-http://www.yaml.org/

它是 JSON 的超集,因此您会熟悉数据文件结构。它支持一些额外的数据类型以及使用将一个数据结构的一部分包含到另一个数据结构的引用的能力。

我不知道它是否会“足够快”——但 libyaml 解析器(用 C 编写)看起来相当敏捷。

【讨论】:

  • 虽然 Yaml 绝不是 JSON 的超集,但我同意它是我所知道的最易读/最紧凑/键入的格式之一。
  • yaml 比 json 复杂得多。我认为大多数实现都比较慢。
  • AFAIK,是的,实现的性能不是很好。 YAML 旨在实现一些不同的目标、最大的表现力等,而不是速度或简单性。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2013-09-13
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多