【问题标题】:Polars with fastapi and docker带有 fastapi 和 docker 的 Polars
【发布时间】:2023-02-22 05:27:57
【问题描述】:

我一直在为我的 Web 应用程序探索 Polars。到目前为止,它一直令人印象深刻,直到我遇到这个问题,这个问题阻碍了我对这个很棒的库的使用。 用例: 我将镶木地板文件读入 Polars 数据帧,使用此 pl 数据帧为 fastapi 上的获取请求提供结果。

@fastApi.get("/polars-test")
async def polars_test():
    polars_df = pl.read_parquet(f"/data/all_area_keys.parquet")
    df = polars_df.limit(3)
    return df.to_dicts()


polars= 0.16.2
pyarrow=9.0.0
fastapi=0.92.0
BaseDockerImage = tiangolo/uvicorn-gunicorn-fastapi:python3.11

当我将它打包成 docker 镜像并在 gunicorn 上运行 fastapi 应用程序时,此获取路径没有响应。使用 /docs,到达这个终点只会等待几分钟,工作人员终止,不会记录任何错误

我开始认为 Polars 多线程不能很好地处理 Fastapi 的并发性。但是我无法找到相关文件来获得理解。请帮助,绝对不想放弃 Polars。

目前已解决的问题:

  1. get 请求在我本地测试时完美运行。
  2. 登录到正在运行的 docker 容器并运行上面的 pl 命令 - 它有效
  3. 刚刚尝试打印数据框的架构 - 它有效。因此创建了数据框并且元数据可用。仅当我在 polars 数据帧上运行过滤器或 Any transform 时才会出现此问题
  4. 创建了一个惰性框架并尝试收集,但没有成功
  5. 从方法中删除异步,运气不好
  6. 将 python 版本从 3.8 更改为 3.11,没有成功
  7. 运行 docker 时将平台指定为 linus/amd64,失败

【问题讨论】:

  • 如果您将返回更改为诸如“hello world”之类的通用内容而不是返回 dict,这行得通吗?看来您还没有排除问题与极地无关。另外,我不知道 fastapi,但在 Flask 中,我认为你会在实际返回之前 jsonify 指令。
  • 谢谢。但这没有帮助。我已经在该路径上返回了 DataFrame.schema,这有效。只有当我应用过滤器或限制或路径变得无响应的任何转换时。
  • 在每一行上方放置一些日志记录,以便在 read_pq 之前的行中放置“收到的请求”,然后执行 f“loaded pq file with shape= {polars_df.shape}” 等等......另外,尝试一个不同的小文件,这样你就可以尝试没有limit

标签: python fastapi python-polars


【解决方案1】:

好吧,在下面找到了解释我所面临问题的详细信息 - https://pola-rs.github.io/polars-book/user-guide/howcani/multiprocessing.html

所以我必须做的改变是删除读取的文件以避免将文件锁传递给新分叉的进程/线程。将读取操作重构为一个函数。

工作代码:

@geodataRouter.get("/polars-test")
async def polars_test():
    ALL_AREA_KEYS_PL = get_all_area_keys_pl()
    df = ALL_AREA_KEYS_PL.limit(3)
    return df.to_dicts()

def get_all_area_keys_pl():
    ALL_AREA_KEYS_PL = pl.read_parquet(f"/data/all_area_keys.parquet")
    return ALL_AREA_KEYS_PL

回想起来,我一开始就不应该在 Fastapi 异步定义中进行 IO 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-20
    • 2019-12-25
    • 2022-09-28
    • 1970-01-01
    • 2023-01-10
    • 2021-12-28
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多