在GCP Vertex AI中如何加载大体积Google BigQuery表到Polars DataFrame?
解决GCP Vertex AI中加载超大BigQuery表到Polars DataFrame的内存问题
针对500-600GB、1亿行的超大BigQuery表,直接全量加载会触发内存限制导致内核崩溃,以下是几种可行的解决方案:
1. 分块批量读取处理
通过BigQuery查询的分页功能,每次读取一小部分数据,避免一次性占用过多内存。可逐块处理数据,或分块写入磁盘(如Parquet格式)后再合并。
import polars as pl from google.cloud import bigquery client = bigquery.Client() query = f"SELECT * FROM `{project_id}.{dataset_id}.table_1`" query_job = client.query(query) # 按每页100万行分块读取 for page in query_job.result(page_size=1_000_000): # 将当前页的Arrow数据转为Polars DataFrame chunk_df = pl.from_arrow(page.to_arrow()) # 在这里添加你的数据处理逻辑,比如清洗、计算 # 示例:将分块数据写入Parquet文件 chunk_df.write_parquet(f"chunk_{page.num}.parquet") # 后续可合并所有分块文件 # combined_df = pl.read_parquet("chunk_*.parquet")
2. 使用BigQuery Storage API流式读取
BigQuery Storage API提供了更高效的大表读取方式,支持直接流式获取数据,无需将全量结果加载到内存,适合超大规模数据集。
import polars as pl from google.cloud import bigquery_storage_v1 client = bigquery_storage_v1.BigQueryReadClient() table_path = f"projects/{project_id}/datasets/{dataset_id}/tables/{table_1}" # 创建读取会话,指定数据格式为Arrow read_session = client.create_read_session( table=table_path, data_format=bigquery_storage_v1.DataFormat.ARROW, read_options=bigquery_storage_v1.ReadOptions( # 可选:只读取需要的列,减少数据量 selected_fields=["col1", "col2", "col3"] ) ) # 流式读取数据并处理 for stream in read_session.streams: reader = client.read_rows(stream.name) for batch in reader.rows().pages: chunk_df = pl.from_arrow(batch.to_arrow()) # 处理当前分块数据 print(f"处理了{len(chunk_df)}行数据")
3. 升级Vertex AI Notebook资源
如果业务需要全量加载数据进行处理,可以临时升级Notebook的实例规格,选择高内存机型(如n1-highmem-32、n2-highmem-64等)。注意:更高配置的实例会带来更高成本,建议处理完成后及时降级。
4. 先在BigQuery中预处理数据
通过BigQuery的SQL提前过滤、聚合或采样数据,减少需要加载到Polars的数据量:
- 只选择业务需要的列(避免加载无用列)
- 用
WHERE条件过滤不需要的行 - 对数据进行聚合(如
GROUP BY)或采样(如TABLESAMPLE SYSTEM (10 PERCENT))
示例查询:
SELECT col1, col2, agg_col FROM `{project_id}.{dataset_id}.table_1` WHERE date >= '2024-01-01' GROUP BY col1, col2
内容的提问来源于stack exchange,提问作者Solomon Papathoti Leo
相关产品推荐
相关产品推荐

