Flask:将大型查询结果转换为JSON:超出内存限制

时间:2017-07-26 19:57:08

标签: python json flask sqlalchemy

我有一个 flask 休息服务器,其中包含许多检索json,tsv和csv文件的方法。

使用 SQLAlchemy 执行原始SQL查询。

我现在正在制作树形图。

查询结果示例:

date - group - person - value
1,1 - Alpha - John Test - 7
1,1 - Alpha - William Test - 7

需要json格式:

[{
  "date": "1,1",
  "name" :"Fixed",
  "children":[{
  "name" :"Alpha",
  "children":[{
    "name":"John Test",
    "size":"7"
  },
  {
    "name":"William Test",
    "size":"7"
  }
]
  },
  {
"name":"Beta",
"children" :[{
  "name":"Another Test",
  "size":"10"
}

我的方法

res 将是数据库结果休息

base = {
    "date": "",
    "name": "Frentes",
    "children": []
}
child = {
    "name": "",
    "children": []
}
sub_child = {
    "name": "",
    "size": ""
}
c = 'children'
for row in res:
    for k, v in list(row.items()):
        if k == 'date':
            if len(ret) == 0 or ret[-1]['date'] != v:
                ret.append(base.copy())
                ret[-1]['date'] = v
                continue
            else:
                continue
        elif k == 'group':
            if len(ret[-1][c]) == 0 or ret[-1][c][-1]['name'] != v:
                ret[-1][c].append(child.copy())
                ret[-1][c][-1]['name'] = v
                continue
            else:
                continue
        elif k == 'person':
            if len(ret[-1][c][-1][c]) == 0 or ret[-1][c][-1][c][-1]['name'] != v:
                ret[-1][c][-1][c].append(sub_child.copy())
                ret[-1][c][-1][c][-1]['name'] = v
                continue
            else:
                continue
        elif k == 'value':
            ret[-1][c][-1][c][-1]['size'] = v
            break

当我在完整数据库中执行包含所有实际结果的代码时:

我可以打印 ret

如果我尝试json.dumps(ret)

,我会收到内存错误

我尝试了json.dumps和jsonify的不同方法,但无法使其正常工作。

我考虑过将所有内容流式传输到文件并返回该文件,但我不确定。

有什么想法吗?

重要提示:我有一个缓存,用于返回的json / tsv / csv文件,并且具有可配置的持续时间。

0 个答案:

没有答案