使用 Marshmallow 的序列化优化,其他解决方案
Serialization optimization using Marshmallow, other solutions
这看起来应该很简单,但是唉:
我有以下 SQLAlchemy 查询对象:
all = db.session.query(label('sid', distinct(Clinical.patient_sid))).all()
需要序列化输出,如 [{'sid': 1}, {'sid': 2},...]
为此,我尝试使用以下简单的 Marshmallow 模式:
class TestSchema(Schema):
sid = fields.Int()
然而,当我这样做时
schema = TestSchema()
result = schema.dump(record)
print result
pprint(result.data)
我得到:
MarshalResult(data={}, errors={})
{}
我的输出。
但是,当我只 select 来自我的查询的一行时,例如,
one_record = db.session.query(label('sid', distinct(Clinical.patient_sid))).first()
我得到了想要的结果:
MarshalResult(data={u'sid': 1}, errors={})
{u'sid': 1}
我知道使用 .all() 的查询正在返回数据,因为当我打印它时,我得到了一个元组列表:
[(1L,), (2L,), (3L,), ...]
我假设 Marshmallow 可以处理元组列表,因为在序列化方法下 marshaling.py 的文档中,它说:
"Takes raw data (a dict, list, or other object) and a dict of..." 但是,认为元组列表可以 class 化为 "lists" 或 "other objects."
的假设可能是不正确的
否则我喜欢 Marshmallow,并希望将其用作使用迭代方法序列化我的 SQLAlchemy 输出的优化,例如:
all = db.session.query(label('sid', distinct(Clinical.patient_sid)))
out = []
for result in all:
data = {'sid': result.sid}
out.append(data)
其中,对于大型记录集,可能需要一段时间才能处理。
编辑
即使 Marshmallow 能够将整个记录集序列化为 SQLAlchemy 的输出,我也不确定我是否会提高速度,因为它看起来也在迭代数据。
除了修改 Clinical 的 class 定义外,对 SQLAlchemy 输出的优化序列化有何建议?
优化我的代码的解决方案是直接从我的 SQLAlchemy 查询对象转到 pandas 数据框(我忘了说我在 pandas 中做了一些繁重的工作我查询的记录集)。
因此我可以跳过这一步
out = []
for result in all:
data = {'sid': result.sid
out.append(data)
使用Pandas的sql_read
方法如下:
import pandas as pd
pd.read_sql(all.statement, all.session.bind)
然后进行我所有的数据操作和旋转,从而缩短了几秒钟的处理时间。
这看起来应该很简单,但是唉:
我有以下 SQLAlchemy 查询对象:
all = db.session.query(label('sid', distinct(Clinical.patient_sid))).all()
需要序列化输出,如 [{'sid': 1}, {'sid': 2},...]
为此,我尝试使用以下简单的 Marshmallow 模式:
class TestSchema(Schema):
sid = fields.Int()
然而,当我这样做时
schema = TestSchema()
result = schema.dump(record)
print result
pprint(result.data)
我得到:
MarshalResult(data={}, errors={})
{}
我的输出。
但是,当我只 select 来自我的查询的一行时,例如,
one_record = db.session.query(label('sid', distinct(Clinical.patient_sid))).first()
我得到了想要的结果:
MarshalResult(data={u'sid': 1}, errors={})
{u'sid': 1}
我知道使用 .all() 的查询正在返回数据,因为当我打印它时,我得到了一个元组列表:
[(1L,), (2L,), (3L,), ...]
我假设 Marshmallow 可以处理元组列表,因为在序列化方法下 marshaling.py 的文档中,它说: "Takes raw data (a dict, list, or other object) and a dict of..." 但是,认为元组列表可以 class 化为 "lists" 或 "other objects."
的假设可能是不正确的否则我喜欢 Marshmallow,并希望将其用作使用迭代方法序列化我的 SQLAlchemy 输出的优化,例如:
all = db.session.query(label('sid', distinct(Clinical.patient_sid)))
out = []
for result in all:
data = {'sid': result.sid}
out.append(data)
其中,对于大型记录集,可能需要一段时间才能处理。
编辑
即使 Marshmallow 能够将整个记录集序列化为 SQLAlchemy 的输出,我也不确定我是否会提高速度,因为它看起来也在迭代数据。
除了修改 Clinical 的 class 定义外,对 SQLAlchemy 输出的优化序列化有何建议?
优化我的代码的解决方案是直接从我的 SQLAlchemy 查询对象转到 pandas 数据框(我忘了说我在 pandas 中做了一些繁重的工作我查询的记录集)。
因此我可以跳过这一步
out = []
for result in all:
data = {'sid': result.sid
out.append(data)
使用Pandas的sql_read
方法如下:
import pandas as pd
pd.read_sql(all.statement, all.session.bind)
然后进行我所有的数据操作和旋转,从而缩短了几秒钟的处理时间。