所以按照这里的答案: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。
答案 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
。
最后,关于大小差异,我怀疑是否会包含一堆冗余信息(可能是模式?)。