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