You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

初始化1500万条记录的Polars DataFrame致机器死机,求优化方案

问题:从AWS RDS Postgres加载1500万条记录到Polars时机器死机

当前使用Psycopg3从AWS RDS Postgres拉取数据,初始化Polars DataFrame时,100万条记录运行正常,但1500万条记录会导致机器死机重启。Psycopg连接器可正常获取全量数据,问题仅出在Polars DataFrame初始化环节,尝试改用LazyFrame后问题依旧。原实现代码如下:

rds_conn = psycopg.connect(
        host=config.RDS_HOST_NAME,
        dbname=config.RDS_DB_NAME,
        user=config.RDS_DB_USER,
        password=config.RDS_DB_PASSWORD,
        port=config.RDS_PORT)
    cur = rds_conn.cursor(name="rds_cursor")
    cur.itersize = 100000
    cur.execute(sql_query)
    names = [x[0] for x in cur.description]
    rows = cur.fetchall()
    cur.close()
    df = pl.DataFrame(rows, schema=names, infer_schema_length=None)

优化方案

1. 分批次加载并增量合并

避免一次性将所有数据加载到内存,通过循环分批获取数据,逐步合并成最终DataFrame,控制单批次内存占用:

rds_conn = psycopg.connect(
    host=config.RDS_HOST_NAME,
    dbname=config.RDS_DB_NAME,
    user=config.RDS_DB_USER,
    password=config.RDS_DB_PASSWORD,
    port=config.RDS_PORT
)
cur = rds_conn.cursor(name="rds_cursor")
cur.itersize = 100000
cur.execute(sql_query)
names = [x[0] for x in cur.description]

# 初始化空DataFrame
df = pl.DataFrame(schema=names)

# 循环分批加载合并
while batch := cur.fetchmany(100000):
    batch_df = pl.DataFrame(batch, schema=names, infer_schema_length=None)
    df = df.vstack(batch_df)

cur.close()
rds_conn.close()

2. 使用Polars原生Postgres读取接口

Polars内置的pl.read_database()方法会自动优化数据加载流程,底层处理分批和内存管理,支持直接生成LazyFrame延迟计算,大幅降低内存压力:

# 生成LazyFrame(推荐,延迟计算仅在需要时执行)
lf = pl.read_database(
    sql_query,
    connection=f"postgresql://{config.RDS_DB_USER}:{config.RDS_DB_PASSWORD}@{config.RDS_HOST_NAME}:{config.RDS_PORT}/{config.RDS_DB_NAME}",
    engine="psycopg"
)

# 若需立即转换为DataFrame,执行:
# df = lf.collect()

3. 自定义紧凑数据类型

手动指定更节省内存的数据类型(如用pl.Int32替代pl.Int64、pl.Categorical存储重复字符串),减少DataFrame整体内存占用:

# 自定义schema,根据实际表结构调整
custom_schema = {
    "user_id": pl.Int32,
    "product_category": pl.Categorical,
    "price": pl.Float32
}

lf = pl.read_database(
    sql_query,
    connection=f"postgresql://{config.RDS_DB_USER}:{config.RDS_DB_PASSWORD}@{config.RDS_HOST_NAME}:{config.RDS_PORT}/{config.RDS_DB_NAME}",
    schema=custom_schema,
    engine="psycopg"
)

内容的提问来源于stack exchange,提问作者Balaji Venkatachalam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:49:55