作为一个avro库,spavro是使用cython的(sp)eedier avro实现——spavro是apache avro python 2官方实现的分支,其目标是大大提高数据读取反序列化和写入序列化性能。

spavro的Python项目详细描述


Spavro Build

(SP)EEDIER AVRO-斯帕夫罗

spavro是official Apache AVRO python 2 implementation的分支,其目标是大大提高数据读反序列化和写序列化性能。

spavro也兼容python 2/3(而不是sperate项目/实现)。Currently tested使用python 2.7、3.3、3.4、3.5和3.6。由于使用Unicode文本和其他兼容性功能,不支持3.3之前的Python版本。

实施细节

官方实施与spavro有三个主要区别。首先,spavro使用cython创建的c扩展来加速一些低级二进制序列化逻辑。另外,spavro使用不同的模式来处理模式。spavro试图解析写和读模式once并且只解析once并从模式定义创建递归读/写函数。这些读写器函数对模式的类型结构进行编码,因此在处理数据时不需要额外的查找。最后一个区别是spavro已经使用six库更新为python 2和python 3兼容。正式的apache avro实现对于python 2和python 3有两个独立的代码库,而spavro只有一个。

这有助于大大提高读写单个数据的吞吐量,因为模式不是针对每个数据进行查询的。这对于“兼容”模式的读取尤其有益,因为读和写模式都需要能够读取完整的数据集。

性能/基准

结果

这些测试是使用运行centos 7的aws m4.large实例运行的。它们的运行版本如下:avro-python3==1.8.2fastavro==0.17.9spavro==1.1.10。python3.6.4用于python 3测试。

tldr是spavro拥有默认apache avro实现的14-23x吞吐量和fastavro库的2-4x吞吐量(取决于记录的形状)。

反序列化avro记录(读取)

每秒读取记录数:

Read, 1 field, records per secRead, 500 fields, records per sec

每秒基准(单个字段)读取:

Read, fields per second

序列化avro记录(写入)

每秒写入记录数:

Write, 1 field, records per secWrite, 500 fields, records per sec

每秒基准(单个字段)写入:

Write, fields per second

方法论

基准测试是使用存储库中/benchmarks路径中的benchmark.py脚本执行的(如果您想运行自己的测试)。

导致创建spavro的许多记录都是{"type": "record", "name": "somerecord", "fields": [1 ... n fields usually with a type of the form of a union of ['null' and a primitive type]]}形式的,因此创建基准来模拟这种类型的记录结构。我相信这是avro的一个very常见用例,因此基准是围绕这个模式创建的。

基准创建一个包含字符串、double、long和布尔类型的随机记录模式,并创建一个随机记录生成器来测试该模式。伪随机生成器使用相同的字符串进行播种,以使结果具有确定性(但记录不同)。记录中的字段数量从1个到500个不等,并且针对每个情况测试了avro实现的性能。

序列化程序和反序列化程序基准在内存中创建一个模拟记录数组,然后尝试使用三种不同的实现尽快处理它们。这意味着最大工作大小仅限于内存(模拟记录中的记录数和字段数的组合)。对于这些基准,每次运行处理5 m基准(除以每个记录中的字段数)。

架构/记录/实现的每次运行都重复十次,并平均完成时间。

API

spavro保留默认的apache库的api。这使得spavro可以代替使用t现有的Apache实现。

测试

由于API与现有库匹配,现有的大多数APACHE测试套件用于验证SPAVro的正确操作。spavro添加了一些额外的正确性测试来比较新旧行为,以及原始库之上和之外的一些额外逻辑测试。一些基于java的“map reduce”测试(特别是系链测试)被删除,因为spavro不包含实现该逻辑的java代码。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
分离实体上的java JPA merge()在其存在时进行插入   java Android Javamail自定义身份验证   java如何找出EAR包中执行的第一个文件   sockets Java:如何重用SocketChannel   java通过MQTT和ssl连接安卓设备   java如何修复控制台中的“未知命令”错误?   java为多线程FizzBuzz编写测试用例   java解析findBy中的嵌套对象属性   异常Java:在这种特殊情况下,如何处理ConcurrentModificationException?   从java教科书中绘制图形   java找不到类型为com的响应对象的MessageBodyWriter。太阳运动衫应用程序编程接口。json。JSONWithPadding媒体类型:application/xjavascript   java如何在Android中将光标设置在tableLayout的行/列中所需的位置   Elasticsearch:java。lang.IllegalArgumentException:在docker容器上运行时不允许自我抑制   如何在Java中继承此方法?   java为什么我的消息消费者不接收所有其他消息?   java为什么@ApplicationScoped bean在CDI扩展的关闭前阶段有一个新实例?