RION——一种快速、紧凑、通用的数据格式

      最后更新:2020-03-21 12:13:01 手机定位技术交流文章

      的全文共有5703个单词,预计需要17分钟才能学会

      来源:Pexels


      原始互联网对象符号(RION)是一种快速、紧凑且通用的数据格式你可能会想,“另一种数据格式“它与CSV、XML、JSON、YAML、ProtoBuf、MessagePack、CBOR、亚马逊的ION、ApacheAvro或ASN.1有什么不同?我将在本文后面清楚地解释它,但是我必须首先介绍RION的背景信息。


      是一种用于高效数据交换和数据存储的数据格式。


      RION是由Nanosai开发的,Nanosai是一家拥有“开放标准”的分布式系统研发公司,这意味着它对每个人都开放。RION最初是为高效的数据交换而设计的。然而,目标用例现在被扩展到包括结构化数据的高效存储


      认为这两个用例是密切相关的,所以这个扩展是有意义的它们之间的主要区别在于,通过网络发送的信息通常具有固定的大小(至少一次),而文件的大小可能会随着时间而增长。


      事实上,我们使用RION作为网络协议的消息编码和数据流存储引擎的记录格式因此,我们对RION的数据交换和数据存储进行了压力测试。


      通用数据格式


      从一开始,我们就希望使RION尽可能通用,这意味着可以对各种结构化数据进行编码。设想是通过使用更常见的数据格式,开发人员不需要频繁地在不同的数据格式之间转换。默认情况下,RION的使用频率越高越好


      显然,没有一种数据格式适合所有数据类型对于视频、音频和强格式文档等特定字段的编码,MP3、MP4或PDF等格式可能更合适。为了适应这种情况,RION被设计成能够嵌入二进制数据和其他结构化数据(例如元数据)


      RION的设计还允许在内置数据类型不足时通过自定义数据类型进行扩展


      来源:pexels


      支持的数据结构


      为了使RION真正通用,RION必须能够表示各种数据结构目前,RION可以表示


      二进制数据

      类型化数据字段(布尔、整数、浮点、文本、日期和时间)

      单字段

      无界字段流

      字段(数组)有界列

      表数据(如CSV文件),仅包括一次列名)

      对象和映射(键-值对例如,可以在表中嵌套一个表,或者在表中嵌套一个对象图,或者在表中有一个表。


      字段类型


      RION编码数据包含一个或多个RION字段每个字段都有一种类型目前,RION包含以下字段类型:


      字节

      布尔

      浮点(32或64位)

      UTF-8

      短UTF-8

      UTC

      (参考)


      字节字段用于“非结构化”二进制数据例如,如果音频或视频文件(或任何其他类型的文件或二进制数据)需要嵌入到RION中,它可以嵌入到字节字段中这实现了二进制数据的有效传输


      布尔字段可以将值表示为真或假


      正整数和负整数代表正整数和负整数正整数被编码并且只包含有效字节因此,包含数字127的正整数字段可以用2字节表示,1024可以用3字节表示另一方面,负数更具挑战性


      例如,32位负整数需要4个字节,因为所有字节都有效为了更有效地编码负数,我们创建了一个负整数字段,其中包含负整数-负1的绝对(正)值这允许使用与处理正整数时相同的高效“有效字节”编码


      浮点类型可以是32位或64位浮点数


      UTF-8或短UTF-8用于以UTF-8格式存储的文本数据短UTF-8使用比UTF-8少1个字节的文本来编码不超过15个字节的文本在包含许多文本字段的数据中,每个字段节省1个字节的总量可能非常大。


      世界协调时以世界协调时格式存储数据和时间网络上日期时间信息的交换是一个常规的用例,所以我们认为RION也应该支持这一点。为了避免时区混乱,我们决定“强制”使用世界协调时来表示日期时间字段


      到目前为止,参考字段仍处于试验阶段它旨在表示RION数据中对早期RION字段的“反向引用”这可用于表示循环对象图,还可避免重复RDBMS结果集或微服务查询响应等中的冗余信息。我们可以添加额外的字段来表示冗余数据的未来副本(例如,重复字段)


      数组字段用于表示RION字段的数组(列表)因此,RION数组可以包含嵌套在其中的其他RION字段所以数组字段是一个复合字段请注意,数组可以表示为具有一列的表,因此实际上我们可以删除数组字段,只保留数组和表数据的表字段。


      表字段用于表示具有列和行的表数据,例如CSV文件或针对相关数据库的SQL查询结果为了高效地编码表数据,表只包含行的列名(键字段),后跟列值行。这类似于CSV文件,第一行是列标题,后续行是每行的列值。单列表可以表示数组,因此您可以删除前面提到的数组字段。该表可以包含嵌套在其中的其他RION字段因此,具有嵌套表的表也可以用来更有效地表示树结构。


      对象字段用于表示键-值对的对象或映射(字典)通常,键-值对将被编码为键字段,然后是一些其他字段,但是如果需要,可以保留键(或值,如果这在您的用例中有意义的话)。您可以在对象中嵌套其他RION字段(包括数组或表字段),以表示所需的对象图。到目前为止,只能表示非循环对象图,但是一旦完成了引用字段的指定,也可以表示循环对象图。


      扩展字段类型旨在指定自己的字段类型,因此除了核心RION字段类型之外,还可以嵌入其他数据类型


      紧凑性


      紧凑性对于RION高效交换和存储至关重要因此,我们已经尽最大努力使RION编码尽可能紧凑。有时为了实现其他设计目标,如高阅读速度,我们不得不做出一些妥协,但在大多数情况下,RION仍然非常紧凑。


      速度


      来源:Pexels


      RION的另一个设计目标是加快读写速度无论何时在读取速度和写入速度之间进行权衡,我们都倾向于读取速度,因为我们希望数据读取的频率高于写入的频率例如,一个RION文件只能写一次,但可以读多次这同样适用于网络消息,这些消息只写一次,然后在传输过程中读取一次或多次


      RION使用紧凑的二进制编码,这使得它的读写速度高于文本编码,如亚马逊的XML、JSON、YAML、MessagePack、CBOR和ION


      此外,RION直接以二进制形式使用当直接以二进制形式读取而不是先反序列化为Java对象时,简单的用例可以快10倍对于更高级的用例,加速是可变的,可以更大或更小。


      此外,RION的设计允许部分可解析性和任意分层导航在一个特定的场景中,一个服务通常会返回比给定客户端需要更多的数据。RION不需要分析所有返回的数据来跳过不必要的部分来导航到所需的部分。您还可以以二进制形式浏览RION数据,分析所需字段,并跳过剩余字段


      二进制编码


      为了实现高紧凑性和高速度,RION使用二进制编码与文本编码相比,二进制编码可以实现更紧凑的数字、日期和二进制数据编码


      对二进制编码的普遍反对意见是,人们在开发、调试和监控过程中很难阅读它为了解决这个问题,我们正在研究RION的文本编码(目前称为“TION”),即RION可以转换为“TION”并返回,以实现在文本编辑器中的轻松阅读和编辑。TION尚未完全就绪,但预计将于2020年某个时候完成。我们还实现了一个从RION到“格式十六进制符号”的转换器,以便它可以在文本编辑器中检查原始字节值。


      自描述


      RION使用自描述编码,这意味着不需要任何体系结构来理解RION数据块自我描述的数据格式使其更易于使用,因为您可以通过浏览数据来查看结构,而无需了解其体系结构。这也使得未知信息体系结构的中间节点更容易发送信息。


      尽管数据格式是自描述的,但将其与体系结构结合起来仍然是有意义的XML+XML模式和JSON+swag/RAML模式就是这种情况。该模式可以对允许值、预期字段等提供额外的限制。对于给定的字段目前,RION没有任何结构性机制,但正在考虑之中。


      更多设计目标


      为了使本文尽可能简短,我省略了一些“不太重要”的RION设计目标,可以在此查看完整版本。

      http://tutorials . jen kov . com/RION/RION-design-goals . html


      RION与其他数据格式


      本节简要介绍RION与目前使用的其他流行数据格式之间的区别但是,请记住,完整的概述需要对数据格式有深入的理解,因此本文的详细程度是有限的。


      首先,RION作为一种二进制数据格式,不同于CSV、XML、JSON和YAML二进制RION意味着它比这些格式更紧凑,读写更快。平均而言,RION的紧凑度比JSON高10%到33%,如果用于表格数据,差异可以超过50%这种紧凑性差异也被转换成类似的读/写速度差异


      文本数据格式在文本编辑器中确实更容易阅读和编辑,但是我们打算通过RION的文本表示(TION)来解决这个问题,以便RION和TION可以相互转换这将减少人的可见性/可编辑性问题


      RION在文件的根级别包含多个字段,这使RION区别于XML和JSON,后者只能在文件的根级别包含一个元素这使得RION更容易用于流数据结构,如日志文件和连续附加的数据文件


      RION使用自描述的二进制代码,类似于MessagePack、CBOR和亚马逊的ION然而,RION在一些微妙而重要的方面与这三者不同。首先,在这些数据格式中,只有RION可以指定表数据的有效编码其次,当浏览复合数据结构(如对象图)时,RION更容易以二进制形式任意浏览第三,RION很快将能够表示一个圆形的对象图,这是MessagePack、CBOR和亚马逊的ION目前都不能做到的。


      此外,Rion在紧凑性和读写速度方面与MessagePack、CBOR和亚马逊的ION相似,只是在表数据方面更好。


      ProtoBuf、ASN.1和Avro都使用需要架构来分析的数据编码换句话说,他们无法描述自己在某些情况下,非自描述数据格式比自描述数据格式更紧凑,但差别较小。然而,需要架构的数据格式可能使用起来很麻烦,所以这是一个折衷的解决方案


      有关更详细的概述,请参见“比较页面”,该页面将不时更新一些数据格式缺失,包括亚马逊的离子,YAML,XML等。,并将添加到末尾。

      就性能而言,测量结果显示RION可以与MessagePack和CBOR的速度相匹配,同时接近ProtoBuf的速度。但是所有的基准都是基于对象的序列化和反序列化如果RION的二进制形式被直接使用和/或只有一部分被解析,速度可以大大提高。我们的基准有点旧,所以我们需要尽快重做。点击链接查看当前基准:

      http://tutories . jen kov . com/rion/RION-performance-benchmarks . html


      摘要和进一步的详细信息


      来源:Pexels


      简而言之,我们相信RION它提供了快速有效的二进制编码和一组通用灵活的字段类型,可以直接以二进制形式读写(以提高速度),或者用于对象的序列化和反序列化。就速度而言,它可以匹配最流行的数据格式,甚至在表格数据格式上超过它们,或者以二进制形式直接读取RION


      我们(Nanosai)花了大量时间分析RION并将其与其他数据格式进行比较,但我们认为当前的编码为扩展提供了良好的基础目前,仍有一些地方需要处理(如参考资料),但我们预计大多数问题将在2020年前解决。随着RION变得越来越完整,我们将再次发布推文。


      我们目前正在使用RION作为网络协议IAP的消息编码,IAP是对HTTP的替代,用于在应用层实现高效灵活的网络通信。国际行动计划仍在研究中,但其基础已经明确界定。


      我们还使用RION作为Java的流操作(可嵌入的数据流引擎)中的记录格式流动操作就像一束“卡夫卡之光”尽管它仍处于概念验证阶段,但我们预计将在2020年对其进行改进。


      流操作使用RION,因此可以获得良好的记录吞吐量速度现在它可以在开发人员的笔记本电脑上压缩到每秒195,000条记录(小记录)。我希望能在数据中心级别的硬件上看到更高的数字。从长远来看,我们力争达到每秒10亿条记录,这可以在1BRS挑战中看到。


      目前,我们的RION开源工具包是用Java实现的。一旦稳定下来,我们计划扩展到其他语言。首先是性能语言,如C#、C/C++,然后是Python,因为它在数据科学中被广泛使用。但这仍有待决定。


      因此,如果您正在寻找一种快速、紧凑、通用的全方位数据格式,无论您使用的是卡夫卡、脉冲星、海兹尔卡斯特等。对于高性能微服务、数据科学或事件驱动架构,有必要考虑RION

      < br>

      关于RION

      的更多信息

      原始互联网对象符号(RION)是此数据格式的当前工作标题我们使用的第一个名字是ION,但一年后,亚马逊发布了一种内部数据格式,名为ION,所以我们将其更名为RION将来它可能会再次改变名字,但是现在,数据格式本身非常稳定。


      来源:Pexels


      如果您对RION的详细信息感兴趣,请参阅RION教程。

      我们还开发了一个开源工具包,名为“面向Java的rionpops”,用于在Java中使用RION。点击以下链接查看

      评论赞扬注意

      我们分享人工智能学习和发展干货

      如果转载,请在后台留言并遵守转载规范

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/2217.html

          热门文章

          文章分类