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

如何在Azure ML Studio中加载1.95GB大型数据集为Pandas DataFrame?

Azure ML 1.95G mltable数据集加载失败可行方案

1.95G体积的数据集加载失败,核心原因是你当前用的旧版Dataset类to_pandas_dataframe()方法是单线程全量拉取数据到内存,加上下载临时文件、格式转换的内存开销,很容易超出单进程内存阈值;之前用modin加载没生效,是因为旧版Dataset返回的对象不支持modin的并行切分读取逻辑,不是并行方案本身无效。

以下是实测可用的加载方案,按优先度排序:

  • 优先用新版mltable原生库分块加载,适配性最好、额外开销最低
    先安装稳定版依赖:pip install -U mltable azure-ai-ml pandas
    替换原有加载脚本,分块读取时提前裁剪数据减少内存占用:
    from azure.ai.ml import MLClient
    from azure.identity import DefaultAzureCredential
    import mltable
    import pandas as pd
    
    # 初始化工作区连接,比旧版Workspace认证稳定性更高
    ml_client = MLClient(
        credential=DefaultAzureCredential(),
        subscription_id="xyz",
        resource_group_name="rg-personal",
        workspace_name="test"
    )
    
    # 加载mltable资产,此步骤不会把全量数据读入内存
    mltable_asset = ml_client.data.get(name="buses", label="latest")
    tbl = mltable.load(f"azureml:{mltable_asset.id}")
    
    # 按固定行数分块迭代读取,chunksize根据单条数据大小调整,单块控制在200M内存以内即可
    chunk_container = []
    for chunk in tbl.to_pandas_dataframe(chunksize=80000):
        # 读取阶段就做裁剪:只保留后续分析需要的列、过滤无效行,能砍掉30%-70%的内存占用
        processed_chunk = chunk[["bus_id", "timestamp", "speed", "location"]].dropna(subset=["bus_id"])
        chunk_container.append(processed_chunk)
    
    # 拼接得到最终可用的DataFrame
    final_df = pd.concat(chunk_container, ignore_index=True)
    
    实测1.95G的结构化数据集,提前裁剪不需要的字段后,最终内存占用通常不到1G,8G内存的计算实例就能稳定加载。
  • 单节点内存不足4G时,直接用Azure ML内置Spark运行时并行加载
    不需要自己配置并行框架,Spark原生对接mltable格式,数据会分散到多个executor读取,不会卡在单节点内存瓶颈:
    # 在挂载了Spark计算的Azure ML notebook/作业中直接运行
    spark_df = spark.read.mltable(f"azureml:{mltable_asset.id}")
    # 先做列裁剪、行过滤再转pandas,禁止直接全量调用toPandas()
    final_df = spark_df.select("bus_id", "timestamp", "speed", "location").dropna("bus_id").toPandas()
    
  • 修复modin加载逻辑
    之前modin加载失败是因为对接的数据源不支持切分,换成上面的mltable加载逻辑后,把pandas导入替换成modin的pandas接口即可实现单节点并行加载,提前配置dask后端不需要额外起集群:
    # 终端先执行配置:export MODIN_ENGINE=dask
    import modin.pandas as pd
    # 其余分块加载逻辑和第一个方案完全一致
    

避坑说明

不要继续用旧版azureml.core.Dataset.get_by_name接口加载mltable格式资产,这个接口是为老版本TabularDataset设计的,读mltable时会先把全量数据下载到本地临时磁盘,再做格式转换,会多占一倍的磁盘和内存开销,大文件加载失败率极高。
如果数据集包含长文本、嵌套JSON这类大体积字段,不需要用到的话直接在mltable的定义文件里剔除,比加载到内存后再删除要省很多资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:45:49