Python中的Apache Avro性能非常慢,编码到消息与文件时的结果不同

时间:2015-11-18 19:14:52

标签: python apache avro

所以按照这里的答案:Encode an object with Avro to a byte array in Python我能够通过ZeroMQ发送消息 - 但性能非常慢。

这是预料之中的,因为Avro Python实现是纯Python,我们看到来自FastAvro作者的类似性能评论。 AFAIK,FastAvro不能用于生成与消息队列一起使用的消息,它适用于写入文件。

回到上面的链接,我很想知道这个方法是不是比它实际需要的更复杂 - 似乎很奇怪Avro DatumWriter不能被原生用于创建适合于消息传递的东西。

这引出了我的最后一点(也是我怀疑的理由)。当我使用Getting Started with Avro (Python)示例中的标准示例时,我可以将我的一个二进制文件传输到.avro文件,它大约为5.8MB。当我使用消息方法将其编码为字节数组时,最终总消息大小为11MB。为什么这些方法之间存在如此巨大的差异?据推测他们会非常相似......

请注意,我已从编写器示例中删除了deflate编解码器,以确保它与苹果对苹果的比较。启用deflate时,大小仅为2.8MB。

1 个答案:

答案 0 :(得分:3)

我不确定你是如何发送消息的,但你应该能够让fastavro发挥作用。例如,由于它可以序列化为任何类文件对象,因此可以直接检索字节:

from fastavro import dump
from io import BytesIO

# A sample schema.
schema = {
  'name': 'Person',
  'type': 'record',
  'fields': [
    {'name': 'name', 'type': 'string'},
    {'name': 'age', 'type': 'int'}
  ]
}

record = {'name': 'Ann', 'age': 23} # Corresponding record.
buf = BytesIO() # Target buffer (any file-like object would work here).
dump(buf, record, schema) # Serialize record into buffer.
message = buf.getvalue() # The raw bytes of your message.

如果您想检查它是否有效:

from fastavro import load

buf.seek(0)
print load(buf, schema) # {'age': 23, 'name': 'Ann'}

如果您的邮件包含页眉,页脚等,您只需根据需要将其写入buf

最后,关于大小差异,我怀疑是否会包含一堆冗余信息(可能是模式?)。