如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?
Posted
技术标签:
【中文标题】如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?【英文标题】:How to serialize/deserialize Pandas DataFrame to and from ProtoBuf/Gzip in a RESTful Flask App? 【发布时间】:2016-11-18 04:26:53 【问题描述】:我有一个 pandas dataframe
在flask
应用程序中作为Flask Response
对象返回。目前我正在将其转换为JSON Object
,
df = df.to_json()
return Response(df, status=200, mimetype='application/json')
数据框的大小非常大,可能是 5000000 X 10。 在客户端,当我将其反序列化为时,
df = response.read_json()
随着URL request parameters
数量的增长,dataframe
的数量也在增长。与序列化相比,反序列化时间以linear factor
增长,这是我想避免的。例如:Serialization
需要 15-20 秒,deserialization
需要 60-70 秒。
在这种情况下,protobuf
是否可以帮助将 pandas 数据帧转换为 protobuf 对象。还有一种方法可以通过烧瓶将JSON
作为Gunzipped
mimetype 发送吗?我相信protobuf
和gunzip
之间的时间和效率相当。
在这种情况下最好的解决方案是什么?
提前致谢。
【问题讨论】:
【参考方案1】:我最近遇到了同样的问题。我通过遍历我的 DataFrame 的行并使用来自 DataFrame 的信息在该循环中调用 protobuf_obj.add() 来解决它。然后,您可以 GZIP 序列化的字符串输出。
即类似于:
for _, row in df.iterrows():
protobuf_obj.add(val1=row[col1], val2=row[col2])
proto_str = protobuf_obj.SerializeToString()
return gzip.compress(proto_str)
鉴于这个问题在 9 个月内没有得到解答,我不确定是否有更好的解决方案,但如果有的话,肯定愿意听取!
【讨论】:
以上是关于如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?的主要内容,如果未能解决你的问题,请参考以下文章
Flask 学习-38.Flask-RESTful 序列化输出中文显示问题
Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置
Flask-RESTful如何add_resource并传递非全局数据
TypeError:使用flask_jwt_extended int RESTful API时类型函数的对象不是JSON可序列化的