gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:31 27 4
gpt4 key购买 nike

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

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

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

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

请注意,我已经从 writer 示例中删除了 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

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

关于python - Python 中的 Apache Avro 性能非常缓慢,编码为消息与文件时的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33788438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com