Azure ML Notebook加载大Parquet文件致内核重启,求无拆分解决方案
解决Azure ML Notebook加载大Parquet文件内存不足问题
方案1:用Dask替代Pandas加载数据
Dask是并行计算框架,支持分块读取Parquet文件,无需将全量数据加载到内存,API和Pandas高度兼容,适合处理超内存的数据集。
- 先安装依赖(如果未安装):
!pip install dask dask[dataframe] pyarrow - 加载代码示例:
from dask import dataframe as dd from azureml.core import Workspace, Datastore # 获取工作区和数据存储 ws = Workspace.from_config() datastore = Datastore.get(ws, datastore_name="your_datastore_name") parquet_path = datastore.path("path/to/your/file.parquet").as_mount() # 分块加载Parquet ddf = dd.read_parquet(parquet_path, engine='pyarrow') # 后续可直接用Dask API操作(和Pandas几乎一致),如需转Pandas可按需取部分数据 # 例如取前1000行转Pandas: # sample_df = ddf.head(1000, compute=True)
方案2:升级计算实例内存规格
Parquet文件加载到Pandas DataFrame后,内存占用通常是原文件的2-5倍(因列类型、压缩等因素),14GB内存远不足以承载20GB+的Parquet数据。直接升级计算实例到更高内存规格:
- 停止当前计算实例
- 在Azure ML Studio的「计算」页面,选择该实例,点击「更改大小」
- 选择内存更高的规格(比如8核32GB、16核64GB等)
- 重启实例后重新运行代码
方案3:用Azure ML Dataset流式分块加载
利用Azure ML Dataset的to_pandas_dataframe方法的chunk_size参数,实现分块读取,避免一次性加载全量数据:
from azureml.core import Workspace, Dataset ws = Workspace.from_config() dataset = Dataset.get_by_name(ws, name="your_parquet_dataset") # 按指定行数分块加载,逐块处理 for chunk in dataset.to_pandas_dataframe(chunk_size=100000): # 在这里处理单块数据,比如分析、特征工程等 process_chunk(chunk)
方案4:优化Pandas读取参数减少内存占用
如果必须用Pandas,通过读取时的参数优化降低内存消耗:
- 只加载需要的列:
df = pd.read_parquet(parquet_path, columns=['col1', 'col2', 'col3']) - 指定更紧凑的数据类型:
dtype_mapping = { "int_col": "int32", "str_col": "category" } df = pd.read_parquet(parquet_path, dtype=dtype_mapping)
内容的提问来源于stack exchange,提问作者ankit
相关产品推荐
相关产品推荐

