解析json结构的速度

时间:2010-12-14 03:20:26

标签: json database-design

我想创建一个简单的数据库系统,并且可能使用JSON作为数据格式进行导入和导出(包括完整数据库备份)。所以我的问题是:与从其他系统导入时的速度(如(更快的)二进制文件)相比,解析JSON的速度有多快,甚至来自 JSON结构(想想千兆字节),或者(更慢) )XML)?

编辑:澄清一下,我想知道解析JSON(进入某种内部数据库格式)的速度有多快,但不知道它作为内部存储机制的速度有多快。 因此,不会查询此JSON数据等,而只是解析为另一种格式。

另外,我问这个问题的主要意图是我想知道JSON是否比XML更容易解析,因为更小的分隔符(']'或'}'而不是''或''),如果它可能是由于非常简单的分隔符,因此速度与二进制格式相似。 (例如,也许json可以像这样解析:record delimiter = ascii code xx(xx是大括号或括号),除非前面有ascii xx(xx是一些转义字符)。)

4 个答案:

答案 0 :(得分:3)

它肯定比MySQL(对于服务器)或SQLite(对于客户端)要慢很多,比这些要好。

此外,JSON速度几乎完全取决于实现。例如,你可以eval()它,但不仅是风险很大,它也比真正的解析器慢。无论如何,可能有比JSON解析器更好的优化XML解析器,因为它是一种更常用的格式。 (因此,获取一个GB大小的XML并想象相同的结果,但速度较慢)。

说真的,JSON从来没有用过大事。如果可能,请使用真实数据库。

编辑:为什么JSON比数据库慢得多?

很多原因。我会尝试列出一些。

  • JSON依赖于匹配的部分,例如{} s(非常类似于XML <> s)

这意味着解析器必须检查对象块的结尾位置。还有其他一些,例如[]""。在传统的数据库中,没有“结束标记”或“结束括号”,所以它更容易阅读。

  • JSON解析器需要先读取每个字符才能理解整个对象结构。

因此,在您甚至可以阅读一些JSON之前,您必须阅读整个文件。这意味着最好等待你提到的大小几分钟,并且可以在不到一秒的时间内查询数据库(因为层次结构存储在开头)。

  • 在JSON中,您无法预先计算偏移量。

在数据库中,交易大小以提高性能。您可以使VARCHAR(512)并且所有字符串都将被空填充以占用512个字节。为什么?因为这样你可以知道第四个值是偏移量2048。你无法用JSON做到这一点,因此性能会受到影响。

  • JSON针对小型文件大小进行了优化。

...因为它是一种网络格式 这可能看起来像专业人士,但从表现的角度来看,这是一个骗局。

  • JSON是一个JavaScript子集。

因此,一些解析器可能允许存在和考虑不必要的数据,例如注释。 Chrome的原生JSON用于举例说明(不再是) 没有数据库引擎使用eval()对吗?

  • JSON意味着具有一定的错误恢复能力。

人们可能会将任何内容放入JSON文件中,因此解析器是防御性的,并且有时会尝试读取无效文件。数据库不应该默默地修复损坏的文件 您可以手动编写JSON而不是数据库!

  • JSON是一种新的,不受支持且经过严格测试的格式

一些原生解析器(如IE8)中存在错误,并且对大多数浏览器的支持是非常初步的,并且比最快的XML解析器慢。仅仅因为XML被使用了很长时间而且史蒂夫鲍尔默有一个XML迷信,所以公司通过制作几乎任何与XML兼容的东西来取悦他。虽然JSON是Crockford成功度过的周末时光之一。

  • 浏览器中最好的JSON解析器

如果您为自己喜欢的语言选择一个随机的开源JSON解析器,它有可能是太阳下最好的解析器吗?那么,对于XML,你确实有awesome parsers like this但JSON的用途是什么?

为什么JSON应该降级到预期用例需要更多理由?

答案 1 :(得分:3)

JVM Serializers项目中可以找到JSON,XML和许多其他内容的基准。结果太复杂,无法在此重现,但最好的JSON结果(比较手动和数据绑定类)比最佳XML结果要好得多。这种比较并不完整,但这是一个起点。

编辑:截至目前(2012-10-30),由于基准正在修订,因此没有公布结果。但是,有一些preliminary results可用。

答案 2 :(得分:2)

如果您将JSON视为数据传输的中间格式,您可能还需要考虑二进制备选方案,因为它们需要更少的磁盘空间和网络带宽(压缩和未压缩),因此您可以更快地解析因为输入解析的时间更短。

如果您运行自己的基准测试,请确保针对同一语言对多个解析器进行基准测试,例如:在纯Python中实现的JSON解析器预计会比用C编写的JSON解析器慢得多 - 但是在同一编程语言中,您可能会发现不同实现之间存在显着的速度差异(最多2倍,但可能是5倍)同样。

答案 3 :(得分:0)

数据库是一个具有更快搜索功能的文件系统。如果您可以使用JSON实现相同的功能,那么事情就很容易了。您必须使系统从JSON文件中更快地搜索内容。