【问题标题】:Is this endpoint (flask+sqlalchemy+sqlite) going to bottleneck on large amounts of data?这个端点(flask+sqlalchemy+sqlite)是否会成为大量数据的瓶颈?
【发布时间】:2020-09-24 15:38:33
【问题描述】:

我正在尝试使用 Flask 构建一个练习 API。问题是我正在尝试解决此端点是否会出现数据库中大量行的问题。

到目前为止,我唯一确定的与输入大小有关的是查询和序列化。代替 query.all() 我可以少用几列,但这是我想出的唯一方法。

有什么想法吗?

@app.route(PREFIX + '/games', methods=['GET'])
def get_games():
    games_list = []
    if len(request.args) == 0:
        all_games = Game.query.all()
        result = games_schema.dump(all_games)

        for g in result:
            games_list.append(
                Feature(geometry=g["geometry"], properties=g["properties"]))

        games_fc = FeatureCollection(games_list)
        return jsonify(games_fc)

    else:
        filters = {key: value for key, value in request.args.items() if key in [
            "category", "location", "district"]}

        allowed_categories = []
        allowed_locations = []
        allowed_districts = []

        for c in db.session.query(Game.category).distinct():
            allowed_categories.append(c.category)

        for l in db.session.query(Game.location).distinct():
            allowed_locations.append(l.location)

        for d in db.session.query(Game.district).distinct():
            allowed_districts.append(d.district)

        for key, value in filters.items():
            if key == "category":
                if value not in allowed_categories:
                    abort(400, "You enetered a non-valid category")
            elif key == "location":
                if value not in allowed_locations:
                    abort(400, "You entered a non-valid location")
            elif key == "district":
                if value not in allowed_districts:
                    abort(400, "You entered a non-valid district")

        filtered_game = Game.query.filter_by(**filters)
        result = games_schema.dump(filtered_game)
        for g in result:
            games_list.append(
                Feature(geometry=g["geometry"], properties=g["properties"]))

        games_fc= FeatureCollection(games_list)
        return jsonify(games_fc)

【问题讨论】:

    标签: python-3.x sqlite flask sqlalchemy marshmallow


    【解决方案1】:

    首先,不要为将来可能遇到的性能问题而烦恼。您将永远永远猜测真正的瓶颈是什么。

    假设你有一个瓶颈,你可以重构几件事:

    • 不要查找类别、位置和地区。它很昂贵,您只是将它用于您的错误消息。如果没有匹配项,则返回一个空结果。
    • 如果您仍想查找类别等,请在您的数据库中的这些列上放置一个索引。这应该会大大加快查找速度。
    • 最后,如果您担心接收方没有足够的内存来处理响应,您可以切换到streaming 您的响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 2021-08-11
      • 2021-07-24
      相关资源
      最近更新 更多