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

Brutally slow Apache Avro performance in Python, different results when encoding to messages vs. files

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

这是意料之中的,因为 Avro Python 实现是纯粹的 Python 并且我们从 FastAvro 的作者那里看到了类似的性能评论。据我所知,FastAvro 不能用于生成用于消息队列的消息,它适用于写入文件。

所以回到上面的 link,我很想知道这种方法是否比实际需要的更复杂 - Avro DatumWriter 不能原生地用于创建某些东西似乎很奇怪适合发短信。

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

请注意,我已经从编写器示例中删除了 deflate 编解码器,以确保它是同类比较。启用 deflate 后,大小仅为 2.8MB。

我不确定您是如何发送消息的,但您应该能够让 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 即可。

最后,关于大小差异,我怀疑包含了一堆冗余信息(也许是模式?)。