gpt4 book ai didi

python - 迭代结果集时的性能问题

转载 作者:行者123 更新时间:2023-12-05 04:28:51 24 4
gpt4 key购买 nike

我们使用 google-cloud-bigquery python 库来查询 Bigquery 并在我们的 python 脚本中处理结果。处理部分转换数据并丰富它,最后创建 JSON 对象。

这就是我们在脚本中使用 BQ 库的方式(简化版):

import google.cloud.bigquery
client = bigquery.Client()
query = "SELECT col1,col2,... FROM <table>"
queryjob = client.query(query)
result_set = queryjob.result(page_size=50000)
for page in result_set.pages:
transform_records()

一般来说,对于中等大小的表,这很好用。但是,我们在查询返回 11 条总共约 3.5 GB 大小的 mio 记录的表时遇到了性能问题。即使我们省略了处理,仅获取页面也需要大约 80 分钟(当在本地或在与 bigquery 数据集位于同一区域的虚拟机/集群中运行时,我们并没有真正观察到任何显着差异)。

关于如何减少加载时间有什么想法吗?

我们尝试了什么:

  • 改变页面大小:较大的页面大小因此较少的页面会减少 http 开销的明显假设是正确的。然而,我们注意到将页面大小设置为 8.500 以上没有任何效果(API 每页返回的最大记录数约为 8.500)。尽管如此,这仍然只占加载时间百分之几的范围内的改进
  • 迭代结果集记录而不是页面:给我们大致相同的性能
  • 通过将加载部分放入后台线程,使用多处理队列与处理工作人员共享数据,将数据加载和处理彼此分开 - 显然对从 BQ 接收数据所花费的纯时间没有影响
  • 尝试并行获取多个页面 - 我们认为这有助于大幅减少加载时间,但未能成功

我们没有尝试的:

  • 使用 BQ 存储 API,或者更确切地说,使用此 API 从 BQ 获取数据的方法(即 result_set.to_arrow_iterable/to_dataframe_iterable):我们希望避免处理数据类型转换的麻烦,因为处理部分将是一个 JSON 对象
  • 直接使用 BQ Rest API 而无需 bigquery 库提供的舒适性,以便能够同时获取结果集的多个页面:这似乎有些复杂,我们甚至不确定 API 本身是否允许这样做同时访问页面
  • 首先使用 client.extract_table-method 将数据导出到 GCS:我们在其他用例中使用了这种方法,并且意识到从 GCS 获取数据的速度要快得多。但是,由于我们的大多数源表都获得了可接受的性能,因此我们宁愿避免导出到 GCS 的这一额外步骤

最佳答案

考虑到数据的大小,应避免使用您提到的方法。

可以应用以下方法之一:

  • 使用内置函数或 UDF 转换 BigQuery 中的表数据或 Remote Functions并将转换后的数据保存到另一个表中
  • 将转换后的表格数据以一个或多个 CSV 或 JSON 文件的形式导出到 Cloud Storage。
  • 使用计算服务将 CSV/JSON 文件加载到非 GCP 系统。

如果转换在 BigQuery 中不可行,则

  • 以一个或多个 CSV 或 JSON 文件的形式将原始表数据导出到 Cloud Storage。
  • 在计算服务上加载每个 CSV/JSON 文件,转换数据并将转换后的数据加载到非 GCP 系统。

关于python - 迭代结果集时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72485655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com